Предупреждение g ++ при использовании старого стиля (приведение C) с устаревшим заголовком C с макросами - PullRequest
0 голосов
/ 08 февраля 2019

Я хочу, чтобы 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.

Существует несколько решений, которые слишком уродливы и / или требуют много времени.

  • Включение / выключение предупреждения для каждого вызова макроса
  • Запись встроенной отдельной оболочкифункции
...