2012-03-19 80 views
11

我们正在C,C++和Java的代码库中进行一些代码清理,修复签名/无符号比较,运行静态分析等。清理C/C++代码揭示了可变宏的问题

一个我们得到的警告是

warning: ISO C does not permit named variadic macros 

及其配套警告

warning: ISO C99 requires rest arguments to be used 

现在,我用C99 standard variadic macro来解决这个问题的C代码,但在C++代码,什么是正确的答案?使用相同的C99风格会产生不同的警告

warning: anonymous variadic macros were introduced in C99 

对于哪个我没有看到任何答案。

我们在Linux中使用GCC(G ++)4.4.3。

我希望有一些标志或其他方法,可以纠正,或禁用它为特定的代码段 - 但它这是在几乎每一个文件中使用的日志记录...

+0

可能重复[是复杂的宏非标准?](http://stackoverflow.com/questions/4786649/are-variadic-macros-nonstandard) – 2012-03-19 17:59:38

+1

使用C++ 11。在你的GCC命令行上键入'-std = C++ 0x'或'-std = C++ 11'。或者只是忽略警告。 – 2012-03-19 18:02:27

+0

是的,使用c + + 11还没有在卡中,它只是没有得到很好的支持(尚未) – Petriborg 2012-03-19 18:04:45

回答

13

使用gcc选项-Wno-variadic-macros禁用该特定警告。

编辑:(从评论)

要禁用警告的一段代码,但离开它一般,使用#pragma GCC diagnosticdescribed here。的

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wno-variadic-macros" 

    // Your code and/or include files 
    // (No variadic warnings here) 

#pragma GCC diagnostic pop 
+1

是否有一种方法可以禁用某段代码的警告,但一般情况下保持不变?如果我使用这个,我该如何禁用'警告:ISO C99需要使用其余参数' – Petriborg 2012-03-19 18:10:11

+1

@Petriborg:http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Diagnostic-Pragmas.html# Diagnostic-Pragmas – Hasturkun 2012-03-19 18:14:42

+0

谢谢@Hasturkun我会尝试的 – Petriborg 2012-03-19 18:17:23