不同cpp文件

时间:2018-01-15 14:19:04

标签: c++ googletest gmock

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

这里发生了什么?为什么barTest.cpp的测试甚至会看到fooTest.cpp中声明的匹配器?它不应该局限于它声明的文件范围吗?如果不是为什么我没有得到一个关于“模糊电话?”的汇编错误?

2 个答案:

答案 0 :(得分:3)

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

来自[basic.def.odr]

  

每个程序都应该包含每个非内联函数或变量的一个定义   该程序在废弃的陈述之外; 无需诊断

IIRC一些联系人可以对这些事情发出警告,但同样没有要求。

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

答案 1 :(得分:2)

使用我的水晶球,你的问题是你必须用同名的内联方法或功能。在类的主体中定义的函数是隐式内联的

当您有两个具有相同名称的不同内联函数时,链接器将以静默方式丢弃除其中一个之外的所有函数。这些名称包括他们所属班级的名称。

如果一个或另一个的实施不同,则会导致问题。一个经典问题是为不同大小的对象内联非平凡的零参数构造函数;其中一个被丢弃,现在你正在为错误的班级清除错误的内存量。

这可以放在违反一个定义规则的脚下 - 你的两个类的存在是一个ODR违规并使你的程序形成错误,无需诊断。

但是知道实际导致你的程序顺利进行的步骤是有用的。

解决这个问题,始终在匿名命名空间内的cpp文件中定义所有。在头文件中定义符号的任何内容都应该完全符合它。现在,一个cpp文件中的定义不会意外地与另一个cpp文件中的定义冲突。