我使用gmock中的MATCHER_P
在不同的* .cpp测试文件中创建了一些匹配器。它们碰巧在同一名称空间中定义并具有相同的名称。运行测试时,我遇到了段错误,因为来自fooTest.cpp
的测试使用了来自barTest.cpp
的匹配器,即使在fooTest.cpp
和{{}中声明了具有相同名称的匹配器1}}显然不包括在内。
这里发生了什么?为什么barTest.cpp
的测试甚至会看到fooTest.cpp
中声明的匹配器?它不应该局限于它声明的文件范围吗?如果不是为什么我没有得到一个关于“模糊电话?”的汇编错误?
答案 0 :(得分:3)
编译器不需要诊断违反One Definition Rule的行为,因此您的程序会显示未定义的行为。
来自[basic.def.odr]
IIRC一些联系人可以对这些事情发出警告,但同样没有要求。每个程序都应该包含每个非内联函数或变量的一个定义 该程序在废弃的陈述之外; 无需诊断。
最好将其中一个函数移动到不同的命名空间中。
答案 1 :(得分:2)
使用我的水晶球,你的问题是你必须用同名的内联方法或功能。在类的主体中定义的函数是隐式内联的。
当您有两个具有相同名称的不同内联函数时,链接器将以静默方式丢弃除其中一个之外的所有函数。这些名称包括他们所属班级的名称。
如果一个或另一个的实施不同,则会导致问题。一个经典问题是为不同大小的对象内联非平凡的零参数构造函数;其中一个被丢弃,现在你正在为错误的班级清除错误的内存量。
这可以放在违反一个定义规则的脚下 - 你的两个类的存在是一个ODR违规并使你的程序形成错误,无需诊断。
但是知道实际导致你的程序顺利进行的步骤是有用的。
解决这个问题,始终在匿名命名空间内的cpp文件中定义所有。在头文件中定义符号的任何内容都应该完全符合它。现在,一个cpp文件中的定义不会意外地与另一个cpp文件中的定义冲突。