Как мне сказать gcc ослабить свои ограничения на приведение типов при вызове функции C из C++?
Я пытаюсь использовать 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 ответа
Я не согласен, и это не ваш код, но, похоже, проще исправить 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
Я не думаю, что есть вариант для этого на уровне компилятора. Возможно, вам удастся обойти это (я полагаю, что вы хотите избежать изменения исходников 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, это, вероятно, там, где оно действительно есть - может быть, сопровождающие примут ваш патч? (Я не знаю).