【发布时间】: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