最简代码:
// --------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()
的不同函数体。
无论这样编码是否正确,我的问题是:这是一个良好定义的行为还是未定义的行为?
inline
会导致一个不同的一次定义规则违反。非内联函数由3.2段3覆盖,内联函数由3.2段5覆盖。许多(大多数?)链接器会捕获非内联违规情况。至少我的链接器没有捕获内联违规情况。 - David Hammen