我正在尝试使用Cmockery模拟从C++代码调用的C函数。因为SUT是C++,所以我的测试必须是C++。

当我像这样使用Cmockery Expect_string()宏时:

expect_string(mock_function, url, "Foo");

我得到:
my_tests.cpp: In function ‘void test_some_stuff(void**)’:
my_tests.cpp:72: error: invalid conversion from ‘void*’ to ‘const char*’
my_tests.cpp:72: error:   initializing argument 5 of ‘void _expect_string(const char*, const char*, const char*, int, const char*, int)’

我在cmockery.h中看到Expect_string已定义:
#define expect_string(function, parameter, string) \
    expect_string_count(function, parameter, string, 1)
#define expect_string_count(function, parameter, string, count) \
    _expect_string(#function, #parameter, __FILE__, __LINE__, (void*)string, \
                  count)

这是_expect_string的原型(prototype)(来自cmockery.h):
void _expect_string(
    const char* const function, const char* const parameter,
    const char* const file, const int line, const char* string,
    const int count);

我相信问题在于我正在将C代码编译为C++,因此C++编译器反对将Expect_string_count宏中的(void*)string作为const char* string参数传递给_expect_string()函数。

我已经在my_tests.cpp中的cmockery.h中使用了extern "C",如下所示:
extern "C" {
#include <cmockery.h>
}

...以解决名称修改问题。 (请参阅“How do I compile and link C++ code with compiled C code?”)

是否有命令行选项或其他某种方式告诉g++如何放松从测试的C++代码到cmockery.c中C函数的类型转换限制?

这是我当前用来构建my_tests.cpp的命令:
g++ -m32 -I ../cmockery-0.1.2 -c my_tests.cpp -o $(obj_dir)/my_tests.o

最佳答案

我知道这不是您的代码,但是看起来更简单的方法可能是通过将强制类型转换为cmockery.h来修复(void*)(可能仅使用#ifdef __cplusplus将某些部分激活为C++)。

甚至可以将它们放在您的代码中,只需重新定义expect_string_count

#ifdef __cplusplus
#undef expect_string_count
#define expect_string_count(function, parameter, string, count) \
    _expect_string(#function, #parameter, __FILE__, __LINE__, string, \
              count)
#endif

10-04 13:31