我希望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.
有些解决方案太丑陋和/或费时。