一个定义规则:相应的实体可以有不同的名称吗?

Arm*_*yan 2 c c++ inline token one-definition-rule

我阅读并重读了C++标准中有关ODR的相关条款,但这个问题仍然对我开放.该标准规定,内联函数的定义应出现在使用它的每个翻译单元中,并且定义在几乎一页中描述的意义上应相同.它说令牌序列必须相同.它是否包含本地标识符名称?

换句话说,以下程序是否违反了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;
}
Run Code Online (Sandbox Code Playgroud)

ybu*_*ill 5

是的,它违反了ODR.它使用不同的令牌序列,我不知道这里有什么难以理解的.

使用传统的编译技术很难(不可能)在翻译单元之间验证ODR.该标准表示"无需诊断",因此您只能获得未定义的行为.

当您使用不相关的翻译单元,但具有相同名称的定义如两种不同类别的你可能会得到更细微的错误.如果有一个虚拟表,它可能会发生冲突而没有任何错误消息(它发生在我的朋友身上).因此,始终对本地函数和类使用匿名名称空间.