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 コードでコンパイルおよびリンクするにはどうすればよいですか?」を参照してください) 。

テストの C++ コードから cmockery.c の C 関数への型キャストに関する制限を緩和する方法を g++ に伝えるコマンド ライン オプションまたはその他の手段はありますか?

これは、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 の他のハック/修正を配置できる場所が得られたことです (あまり多くないことを願っています)。

おそらくそれが本当に属する場所であるCMockeryのものを変更するつもりなら、メンテナーはあなたのパッチを受け入れるでしょうか? (私は知らないよ)。

于 2011-01-06T01:26:37.970 に答える