具有内联函数的不同定义是不确定的行为?

iam*_*ind 9 c++ inline undefined-behavior function-prototypes

最小代码:

// --------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();
}
Run Code Online (Sandbox Code Playgroud)

如果我们调用fun1()fun2(),那么他们将打印YESNO分别,这意味着它们所指的同不同的功能体X::foo().

无论这应该编码与否,我的问题是:
这是一个定义明确或未定义的行为?

Alo*_*ave 13

是的,它是未定义的行为.

参考:

C++ 03标准:

7.1.2函数说明符[dcl.fct.spec]
第4段:

内联函数应在每个使用它的翻译单元中定义,并且在每种情况下都应具有完全相同的定义(3.2).[注意:在定义出现在翻译单元之前,可能会遇到对内联函数的调用.]如果在一个翻译单元中内联声明具有外部链接的功能,则应在其出现的所有翻译单元中内联声明; 无需诊断.具有外部链接的内联函数在所有翻译单元中应具有相同的地址.外部内联函数中的静态局部变量始终引用同一个对象.extern内联函数中的字符串文字是不同翻译单元中的相同对象.

注意:3.2指的是一个定义规则,其中规定:

3.2一个定义规则[basic.def.odr]
第1段:

任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.

  • @abarnert:`inline`不仅仅是一个提示.函数体是否被函数体替换是由编译器自行决定的,但是一旦你使用`inline`,编译器**必须遵循一定的规则和一个定义规则. (3认同)

Pup*_*ppy 7

未定义.您违反了ODR.