c++对一个定义规则的混淆

C++ confusion about one definition rule

本文关键字:规则 定义 一个 c++      更新时间:2023-10-16

我正在阅读一个定义规则。它说:

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

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

就像它说的。您用不同的定义两次定义了同一个类S。语言的创造者已经声明你不应该这样做。原因是允许这样做显然是荒谬的,并且会破坏翻译单元之间的兼容性。哪个定义是"正确的"?你的编译器应该使用哪个?

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