带有旧版C标头(包含宏)的老式广播(C强制转换)上的g ++警告

时间:2019-02-08 15:31:11

标签: c++ casting g++ compiler-warnings

我希望g ++ -Wold-style-cast在我的C ++代码中警告我有关C样式的强制转换。 问题是带有看起来像函数的宏的C API。

我可以使用#pragma禁用包含警告(请参见示例)。这适用于内联函数,但不适用于宏扩展。

如何在使用C API宏时使C样式的警告静音,但为我的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.

有些解决方案太丑陋和/或费时。

  • 为每个宏调用关闭/打开警告
  • 编写单个包装内联函数

0 个答案:

没有答案