不同cpp文件中同一个命名空间的两个同名对象

Two objects with the same name in the same namespace in different cpp files

我使用 gmock 中的 MATCHER_P 在不同的 *.cpp 测试文件中创建了一些匹配器。它们碰巧在同一个命名空间中定义并且具有相同的名称。当 运行 测试时,我遇到了段错误,因为来自 fooTest.cpp 的测试使用了来自 barTest.cpp 的匹配器,即使在 [=11= 中声明了具有相同名称的匹配器] 和 barTest.cpp 显然不包括在内。

这是怎么回事?为什么来自 fooTest.cpp 的测试甚至可以看到 barTest.cpp 中声明的匹配器?它不应该被限制在它声明的文件的范围内吗?如果不是,为什么我没有收到关于 "ambiguous call?"

的编译错误

编译器不需要诊断违反 One Definition Rule,因此您的程序表现出未定义的行为。

来自[basic.def.odr]

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program outside of a discarded statement; no diagnostic required.

IIRC 一些链接器可以警告这些事情,但同样没有要求。

最好将其中一个函数移动到不同的命名空间中。

使用我的 crystal 球,你的问题是你必须使用相同名称的内联方法或函数。 class 主体中定义的函数隐式内联.

当您有两个同名的不同内联函数时,链接器会自动丢弃除其中一个以外的所有函数。这些名称包括它们所属的 class 的名称。

如果一个或另一个的实现不同,就会导致问题。一个 classic 问题是为不同大小的对象内联非平凡的零参数构造函数;其中一个被丢弃了,现在你正在为错误的 class.

清除错误的内存量

这可能是违反单一定义规则的原因——您的两个 classes 的存在本身就是 ODR 违规并使您的程序格式错误,无需诊断。

但了解实际导致程序崩溃的步骤很有用。

此修复是 始终 在匿名命名空间内的 cpp 文件中定义 一切。任何在头文件中定义符号的东西都应该完全限定它。现在,一个 cpp 文件中的定义不会意外地与另一个文件中的定义发生冲突。