【问题标题】:C++ confusion about one definition ruleC++ 对一个定义规则的混淆
【发布时间】:2015-09-21 16:25:31
【问题描述】:

我正在阅读有关One Definition Rule 的信息。它说:

如果一个 .cpp 文件定义了 struct S { int x; }; 和其他 .cpp 文件 定义 struct S { int y; };,链接的程序的行为 它们在一起是未定义的。这通常通过未命名的方式解决 命名空间。

我不明白为什么以及它是如何未定义的?有人能解释一下这背后的真正原因吗?未命名的命名空间如何解决?

【问题讨论】:

  • 您以两种不同的方式声明同一个结构,因此代码的两个不同部分对它的看法不同。诚然,仅更改名称但保持类型相同可能适用于当今大多数 C++ 编译器,但规范无法保证。
  • 此示例违反了使用相同标记序列定义具有外部链接和相同名称的两种类型的要求(即,允许空格差异,但不允许使用 typedef 等类型别名) 以及在解析令牌时查找相同的实体。在您链接到的页面的项目符号列表的第一个项目符号中可以找到关于相同标记序列的那一点。

标签: c++ undefined-behavior one-definition-rule


【解决方案1】:

正如它所说的那样。您定义了相同的类S 两次,但定义不同。语言的制造者已经声明你不能这样做。原因是允许它显然是荒谬的,并导致破坏翻译单元之间的兼容性。哪个定义是“正确的”?你的编译器应该使用哪个?

未命名的命名空间导致两个定义实际上定义了不同S,它们被正确命名为类似于my-anonymous-namespace-1::Smy-anonymous-namespace-2::S,尽管你永远不能这样引用它们因为命名空间是匿名的。

【讨论】:

  • 谢谢。有道理
猜你喜欢
  • 2017-12-13
  • 2014-01-10
  • 2018-04-30
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多