ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GoogleMock MOCK_METHOD 带 const 参数时 MSVC 报警告怎么解决

GoogleMock MOCK_METHOD 带 const 参数时 MSVC 报警告怎么解决 GoogleMock MOCK_METHOD 带 const 参数时 MSVC 报警告怎么解决【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest用 GoogleMock 的MOCK_METHOD宏 mock 一个虚函数时如果参数是const int这类带顶层const的值类型用 MSVC 编译可能出现warning C4301或warning C4373。GoogleTest 官方的 gMock FAQ 明确把这两条警告归因为 MSVC 的已知 bug并给出了官方推荐的解决方法把基类和 mock 类声明中的顶层const都去掉。本文按 FAQ 的原始说法给出完整的定位、修复和边界说明。什么样的代码会触发这条警告gmock_faq.md 中的原始示例是这样的docs/gmock_faq.mdclass Foo { ... virtual void Bar(const int i) 0; }; class MockFoo : public Foo { ... MOCK_METHOD(void, Bar, (const int i), (override)); };用 MSVC 编译这段代码时会看到其中一条警告具体取决于编译器版本Microsoft Visual C 2005 SP1 下报警告 C4301warning C4301: MockFoo::Bar: overriding virtual function only differs from Foo::Bar by const/volatile qualifierVisual C 2008 SP1 下报警告 C4373warning C4373: MockFoo::Bar: virtual function overrides Foo::Bar, previous versions of the compiler did not override when parameters only differed by const/volatile qualifiersFAQ 同时说明同样的代码用 gcc 等编译器编译没有任何问题这是 MSVC 的 bug不是你 mock 写错了。为什么 const 参数会引发这个警告C 语言规定在声明函数时参数上的顶层const修饰符会被忽略。所以上面那个基类Foo在语言层面等价于class Foo { ... virtual void Bar(int i) 0; // int or const int? Makes no difference. };甚至你可以在声明里写int、在定义里写const int编译器照样把它们匹配上。正因为声明层面的参数const没有意义MSVC 在匹配重写函数时才会因为基类和派生类签名里const的有无不一致而误报警告。修复方法在基类和 mock 类中同时去掉 constFAQ 给出的官方建议是既然给参数加const在方法声明里毫无意义就在Foo和MockFoo两处把const都删掉以此绕开这个 VC bug。修改后的代码class Foo { ... virtual void Bar(int i) 0; }; class MockFoo : public Foo { ... MOCK_METHOD(void, Bar, (int i), (override)); };注意这是两处都要改基类纯虚声明和MOCK_METHOD宏里的参数列表保持一致。改完后重新编译C4301/C4373警告即被消除行为与 gcc 下编译一致。不要把指针/引用参数里的 const 也删掉FAQ 特别强调这里说的是顶层const修饰符。如果参数是指针或引用把被指对象或被引用对象声明为const仍然是有意义的两类声明并不等价不能一起删void Bar(int* p); // Neither p nor *p is const. void Bar(const int* p); // p is not const, but *p is.也就是说只有const int这种值参数上的顶层const属于可以安全删除的范畴const int*、const Foo这类写法表达的是不同的语义不属于本警告的修复范围。顺带区分MOCK_METHOD 第 4 个参数里的 (const)排查时容易混淆的一点是MOCK_METHOD宏的第 4 个参数Specs里也可以写const例如 docs/gmock_for_dummies.md 中的写法MOCK_METHOD(int, GetX, (), (const, override));但 docs/gmock_cook_book.md 对 Specs 的定义是const—— Makes the mocked method aconstmethod. Required if overriding aconstmethod.它控制的是方法本身是否为const成员函数重写基类的const方法时才需要。这与参数列表里值参数顶上的const int完全是两回事触发 C4301/C4373 警告的是后者修复时删的也应该是参数上的const而不是第 4 个参数里的(const)。适用条件与限制该问题只与 MSVC 相关FAQ 明确给出的是 Visual C 2005 SP1C4301和 Visual C 2008 SP1C4373下的警告信息gcc 编译同一段代码不会报警告。删除顶层const不改变任何运行时行为——声明中的顶层const本来就被语言忽略——所以这个改动是安全的FAQ 也将其作为对该 bug 的 workaround 直接推荐。如果你的项目还在用其他 mock 写法比如旧版MOCK_METHODx宏原理相同凡是参数列表里出现const int这类顶层const的地方都按上面同样的方式删掉即可。完整的原始讨论含两条警告的完整文本和 C 语义解释见 gMock FAQ 对应条目。【免费下载链接】googletestGoogleTest - Google Testing and Mocking Framework项目地址: https://gitcode.com/GitHub_Trending/go/googletest创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表