3

我正在尝试使用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 的原型(来自 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++ 编译器反对(void*)string将 expect_string_count 宏作为const char* string参数传递给 _expect_string() 函数。

我已经extern "C"在 my_tests.cpp 中使用了 cmockery.h ,如下所示:

extern "C" {
#include <cmockery.h>
}

...为了解决名称修改问题。(请参阅“如何编译和链接 C++ 代码与已编译的 C 代码? ”)

是否有命令行选项或其他方式告诉 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
4

2 回答 2

3

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

甚至可以放入您的代码中,只需重新定义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
于 2011-01-06T01:21:47.520 回答
2

我认为在编译器级别没有这个选项。您可以通过为 CMockery 执行类似以下操作以使其在C 和 C++:

#ifndef MY_CMOCKERY_H
#define MY_CMOCKERY_H

/*
    A wrapper for cmockery.h that makes it C++ friendly while keeping things
    the same for plain-old C
 */

#if __cplusplus
extern "C" {
#endif

#include "cmockery.h"

#if __cplusplus
}
#endif


#if __cplusplus
// fixup CMockery stuff that breaks in C++

#undef expect_string_count
#define expect_string_count(function, parameter, string, count) \
    _expect_string(#function, #parameter, __FILE__, __LINE__, (char*)string, \
                  count)

#endif


#endif  /* MY_CMOCKERY_H */

另一个好处是,现在你有了一个地方,你可以在你遇到的 C++ 下放置任何其他 CMockery 的 hacks/修复(希望不会太多)。

如果您准备修改可能是它真正属于的 CMockery 的东西 - 也许维护者会接受您的补丁?(我不知道)。

于 2011-01-06T01:26:37.970 回答