我反复阅读了C++标准中关于ODR的相关条款,但这个问题仍然悬而未决。该标准规定,内联函数的定义应出现在使用它的每个翻译单元中,并且定义在某种意义上应该是相同的,几乎用一页纸来描述。它说 token 序列必须相同。它是否包括本地标识符名称?
换句话说,下面的程序是否违反了 ODR?(我尝试用 Visual Studio 2008 自己测试它,得到 0 个错误和 0 个警告。但我猜这并不能证明什么,因为我随后将示例更改为两个完全不同的定义,但仍然得到 0 个错误和 0 个警告。以 MSVC 为借口,应该注意的是,对于违反 ODR 的情况,不需要正式进行诊断。
//main.cpp
inline int f(int);
int main(){
f(3);
}
int f(int x){
int z = x;
return z*z;
}
//other.cpp
inline int f(int xx){
int zz = xx;
return zz*zz;
}
最佳答案
是的,它违反了 ODR。它使用不同的标记序列,因为 x
与 xx
是不同的标记。就这么简单。虽然它可以有不同的空格或注释,因为它们不是标记。
使用传统的编译工具链很难甚至不可能跨翻译单元验证 ODR。标准说“不需要诊断”,所以你只会得到未定义的行为。
当您使用例如时,您可能会遇到更微妙的错误在不相关的翻译单元中定义的两个不同的类,但具有相同的名称。如果有一个虚拟表,它可能会发生冲突而不会出现任何错误消息。所以总是对本地函数和类使用匿名命名空间。
关于c++ - 一条定义规则 : Can corresponding entities have different names?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297480/