Как мне сказать gcc ослабить ограничения на приведение типов при вызове функции C из C ++? - PullRequest
3 голосов
/ 06 января 2011

Я пытаюсь использовать Cmockery для имитации функций C, вызываемых из кода C ++. Поскольку SUT находится в C ++, мои тесты должны быть в C ++.

Когда я использую макрос Cmockery wait_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 я вижу, что строка_перечисления определена:

#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 в макросе hope_string_count, передаваемом в качестве параметра const char* string в функцию _expect_string ().

Я уже использовал extern "C" для включения cmockery.h в my_tests.cpp, например:

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

... чтобы обойти проблему искажения имен. (См. " Как мне скомпилировать и связать код C ++ с скомпилированным кодом C? ")

Есть ли опция командной строки или какой-либо другой способ сообщить g ++, как ослабить свои ограничения на приведение типов из кода C ++ моего теста в функцию C в cmockery.c?

Это команда, которую я сейчас использую для сборки my_tests.cpp:

g++ -m32 -I ../cmockery-0.1.2 -c my_tests.cpp -o $(obj_dir)/my_tests.o

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Я недооцениваю и это не ваш код, но, похоже, проще всего исправить 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
2 голосов
/ 06 января 2011

Я не думаю, что есть вариант для этого на уровне компилятора. Возможно, вам удастся обойти это (я полагаю, что вы хотите избежать изменения исходников CMockery из-за комментариев, которые я прочитал в другом из ваших вопросов), имея заголовок-обертку для 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 */

Дополнительным преимуществом является то, что теперь у вас есть место, куда вы можете поместить любые другие хаки / исправления для CMockery под C ++, которые вам встретятся (надеюсь, их не так уж много).

Если вы хотите изменить материал CMockery, то, вероятно, он к этому относится - может быть, сопровождающие примут ваш патч? (Я не знаю).

...