Минимальный код:Является ли неопределенное поведение разными определениями встроенной функции?
// --------inline.h--------
struct X {
static inline void foo();
};
#ifdef YES
inline void X::foo() { cout << "YES\n"; }
#else
inline void X::foo() { cout << "NO\n"; }
#endif
// --------file1.cpp--------
#define YES // <----
#include"inline.h"
void fun1()
{
X::foo();
}
// --------file2.cpp--------
#include"inline.h"
void fun2()
{
X::foo();
}
Если мы называем fun1()
и fun2()
, то они будут печатать YES
и NO
соответственно, что означает, что они имеют в виду различные функции тела же X::foo()
.
Независимо от того, это должно быть закодировано или нет, мой вопрос:
Является ли это четко определенным или неопределенным поведением?
Если вы хотите иметь две разные свободные функции (не члены класса) в двух разных файлах, но с тем же именем, вы можете выделить их с помощью ключевого слова 'static' (или анонимного пространства имен). Пометка функции в файле2.cpp как статичная означает, что ни один другой файл .cpp не видит ее во время связывания. Это полезно для очень больших программ, где вы не всегда можете быть уверены, какие общие имена уже заняты функциями. – Crashworks
Вам действительно не нужно inline.h и #define hack в этом случае; просто определите «void X :: foo()» (с встроенным или без него) одним способом в файле file1.cpp, а другой в файле file2.cpp, и вы будете иметь такое же поведение. – abarnert
@abarnert: отказ от 'inline' приводит к другому нарушению одного правила определения. Нелинейные функции охватываются п. 3.2 абзаца 3, встроенные функции п. 3.2 параграфа 5. Многие (большинство?) Линкеров улавливают не-встроенные нарушения. Мина, по крайней мере, не улавливает встроенные нарушения. –