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(),那么他们将打印YES和NO分别,这意味着它们所指的同不同的功能体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段:
任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |