c++ - 一条定义规则 : Can corresponding entities have different names?

标签 c++ c inline token one-definition-rule

我反复阅读了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。它使用不同的标记序列,因为 xxx 是不同的标记。就这么简单。虽然它可以有不同的空格或注释,因为它们不是标记。

使用传统的编译工具链很难甚至不可能跨翻译单元验证 ODR。标准说“不需要诊断”,所以你只会得到未定义的行为。

当您使用例如时,您可能会遇到更微妙的错误在不相关的翻译单元中定义的两个不同的类,但具有相同的名称。如果有一个虚拟表,它可能会发生冲突而不会出现任何错误消息。所以总是对本地函数和类使用匿名命名空间。

关于c++ - 一条定义规则 : Can corresponding entities have different names?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297480/

相关文章:

c++ - 功能仍然失败,不确定为什么...运行测试用例的想法?

c++ - 变量引用以及指针如何与内存交互

c - -O0 处的内联函数导致 clang 中的链接失败

c++ - 使用制表符完成打印变量时 gdb 卡住

c - 如何删除代码中 undefined reference ?

c - 以左括号开头的类对象宏定义

c - 在cygwin中编译linux C程序时遇到问题

c++ - 如何在VS2013中使用内联版本的memcpy?

c++ - 内联函数在链接期间发生冲突?

c++ - 如何禁止公共(public)继承但允许私有(private)(和 protected )继承