// --------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()的不同函数体.
无论是否应该编码,我的问题是:
这是一个明确定义还是未定义的行为?
解决方法
参考:
C 03标准:
7.1.2函数说明符[dcl.fct.spec]
第4段:
An inline function shall be defined in every translation unit in which it is used and shall have exactly the same deFinition in every case (3.2). [Note: a call to the inline function may be encountered before its deFinition appears in the translation unit. ] If a function with external linkage is declared inline in one translation unit,it shall be declared inline in all translation units in which it appears; no diagnostic is required. An
inline function with external linkage shall have the same address in all translation units. A static local variable in an extern inline function always refers to the same object. A string literal in an extern inline function is the same object in different translation units.
注意:3.2指一定义规则,其中规定:
3.2一个定义规则[basic.def.odr]
第1段:
No translation unit shall contain more than one deFinition of any variable,function,class type,enumeration type or template.
原文地址:https://www.jb51.cc/c/115122.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。