为什么不为 GMock 1.8.0 编译带有可变参数的模拟函数

Why mocking functions with volatile arguments is not compiling for GMock 1.8.0

考虑这个片段

MOCK_METHOD1(foo, int(volatile int*));

这段代码在 GMock 1.7.0 上编译得很好,但是当我更新到 GMock 1.8.0 时它抛出了一个错误

../gmock/fused-src/gtest/include/gtest/gtest-printers.h:467:6: error: reinterpret_cast from type 'volatile int*' to type 'const void*' casts away qualifiers
*os << reinterpret_cast<const void*>(p);
^

很明显它没有编译,因为根据定义,reinterpret_cast 无法删除 cv 限定符。

我还需要提到我正在使用 c++98,所以 remove_volatile,不幸的是,不能使用。

此外,一些函数的参数默认具有 volatile 说明符,因为它们与嵌入式设备中的内存直接交互。

有没有办法解决这个问题?

它实际上是 Gmock 中缺少的功能吗?

有一个 open proposal 可以扩展 GMock 以提供您需要的支持:

Currently gmock don't have macros for mocking volatile and const volatile methods. There are several options to solve this:

  1. provide

    MOCK_VOLATILE_METHOD0 MOCK_VOLATILE_METHOD0_T
    MOCK_VOLATILE_METHOD0_WITH_CALLTYPE
    MOCK_VOLATILE_METHOD0_T_WITH_CALLTYPE

and friends as needed.

  1. expose a variation of GMOCK_METHOD0_ to let the user write

    GMOCK_METHOD0(volatile, , Foo, int()); GMOCK_METHOD0_T(const volatile, , Bar, int());

在此之前已被接受和实施 - 您可以通过从 "real" 调用模拟函数来解决此类问题:

virtual void foo(volatile int* param) { mockedFoo(const_cast<int*>(param)); }
MOCK_METHOD1(mockedFoo, int(int*));