Я хочу, чтобы g ++ -Wold-style-cast
предупредил меня о приведениях в стиле C в моем коде C ++.Проблема в C API с макросами, которые выглядят как функции.
Я могу использовать #pragma
, чтобы отключить предупреждение для включения (см. Пример).Это работает для встроенных функций, но не для расширения макроса.
Как можно отключить предупреждения в стиле C при использовании макросов C API, но включить их для моего кода C ++?
Пример
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include "example_c_api.h"
#pragma GCC diagnostic pop // Removing the `pop` quiets **all** warnings
float my_cpp_code()
{
int i= func_inline(42.f); // no warning here == good
int j = funcy_macro(1); // don't want a warning here -- just using the C API.
return (float)i + (float)j; // I WANT a warning here.
}
с заголовком C API
/* example_c_api.h : a C API header that naturally uses C-style casts */
#ifdef __cplusplus
extern "C" {
#endif
#define funcy_macro(x) (int)x
inline int func_inline(float f) { return (int)f; }
#ifdef __cplusplus
}
#endif
В версиях g ++ 4.8.5, 5.4.0 и 7.3.0 вместо того, что я хочу, я получаю два предупреждения ...
$ g++ -Wold-style-cast -c wosc.cc
wosc.cc: In function ‘float my_cpp_code()’:
wosc.cc:9:25: warning: use of old-style cast [-Wold-style-cast]
int j = funcy_macro(1); // don't want a warning here -- just using the C API.
^
example_c_api.h:6:30: note: in definition of macro ‘funcy_macro’
#define funcy_macro(x) (int)x
^
wosc.cc:10:19: warning: use of old-style cast [-Wold-style-cast]
return (float)i + (float)j; // I WANT a warning here.
Существует несколько решений, которые слишком уродливы и / или требуют много времени.
- Включение / выключение предупреждения для каждого вызова макроса
- Запись встроенной отдельной оболочкифункции