1

我正在阅读有关One Definition Rule的内容。它说:

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

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

4

1 回答 1

4

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

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

于 2015-09-21T16:38:29.547 回答