g++;旧样式转换(C转换)中带有宏的旧C头的警告 我希望G++ -WordStaseCase在C++代码中警告我关于C样式的转换。 问题在于C API中的宏看起来像函数

g++;旧样式转换(C转换)中带有宏的旧C头的警告 我希望G++ -WordStaseCase在C++代码中警告我关于C样式的转换。 问题在于C API中的宏看起来像函数,c++,casting,g++,compiler-warnings,C++,Casting,G++,Compiler Warnings,我可以使用#pragma禁用include的警告(参见示例)。这适用于内联函数,但不适用于宏扩展 < >强>我如何在使用C API宏时,使C样式警告安静,但使其适合我的C++代码?< /强> < /P> 范例 #pragma GCC诊断推送 #pragma GCC诊断已忽略“-Wold样式转换” #包括“示例_c_api.h” #pragma GCC diagnostic pop//删除'pop'会使**所有**警告静音 浮动my_cpp_代码() { int i=func_inline(42.

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

< >强>我如何在使用C API宏时,使C样式警告安静,但使其适合我的C++代码?< /强> < /P> 范例

#pragma GCC诊断推送
#pragma GCC诊断已忽略“-Wold样式转换”
#包括“示例_c_api.h”
#pragma GCC diagnostic pop//删除'pop'会使**所有**警告静音
浮动my_cpp_代码()
{
int i=func_inline(42.f);//此处无警告==良好
int j=funcy_macro(1);//这里不需要警告——只需使用C API即可。
return(float)i+(float)j;//我想在这里得到一个警告。
}
使用C API头

/*示例_c_api.h:自然使用c样式转换的c api头*/
#ifdef_uucplusplus
外部“C”{
#恩迪夫
#定义函数_宏(x)(int)x
inline int func_inline(float f){return(int)f;}
#ifdef_uucplusplus
}
#恩迪夫
对于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.
有两种解决方案太难看和/或太费时


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

“为每个宏调用关闭/打开警告”-或将关闭/打开设置为宏本身。分别使用
-Wold样式转换运行,就像在夜间QA构建中一样,并过滤误报。“为每个宏调用关闭/打开警告”-或将关闭/打开设置到宏本身。分别使用
-Wold样式的cast
运行,就像在夜间QA构建中一样,并过滤误报。