如何禁用几行代码的GCC警告

在Visual C ++中,可以使用#pragma warning (disable: ...) 。 另外我发现在GCC中你可以覆盖每个文件的编译器标志 。 我怎样才能做到这一点“下一行”,或使用GCC代码周围的推/ pop语义?

看来这可以做到 。 我无法确定它所添加的GCC版本,但这是2010年6月之前的某个时间。

这是一个例子:

 #pragma GCC diagnostic error "-Wuninitialized" foo(a); /* error is given for this one */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" foo(b); /* no diagnostic for this one */ #pragma GCC diagnostic pop foo(c); /* error is given for this one */ #pragma GCC diagnostic pop foo(d); /* depends on command line options */ 

为了把所有东西都净化掉,这是一个暂时禁用警告的例子:

 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-result" write(foo, bar, baz); #pragma GCC diagnostic pop 

您可以查看诊断编译指南中的GCC文档以获取更多详细信息。

 #pragma GCC diagnostic ignored "-Wformat" 

将“-Wformat”replace为警告标志的名称。

AFAIK没有办法使用push / pop语义来select这个选项。

 #define DIAG_STR(s) #s #define DIAG_JOINSTR(x,y) DIAG_STR(x ## y) #ifdef _MSC_VER #define DIAG_DO_PRAGMA(x) __pragma (#x) #define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(warning(x)) #else #define DIAG_DO_PRAGMA(x) _Pragma (#x) #define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(compiler diagnostic x) #endif #if defined(__clang__) # define DISABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,push) DIAG_PRAGMA(clang,ignored DIAG_JOINSTR(-W,clang_option)) # define ENABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,pop) #elif defined(_MSC_VER) # define DISABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,push) DIAG_DO_PRAGMA(warning(disable:##msvc_errorcode)) # define ENABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,pop) #elif defined(__GNUC__) #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 # define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,push) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option)) # define ENABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,pop) #else # define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option)) # define ENABLE_WARNING(gcc_option,clang_option,msvc_unused) DIAG_PRAGMA(GCC,warning DIAG_JOINSTR(-W,gcc_option)) #endif #endif 

这应该做的gcc,铛和msvc的伎俩

可以调用例如:

 DISABLE_WARNING(unused-variable,unused-variable,42) [.... some code with warnings in here ....] ENABLE_WARNING(unused-variable,unused-variable,42) 

请参阅https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html,http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas和https://msdn.microsoft .com / de-DE / library / d9x1s805.aspx了解更多详情

您至less需要4.02版本才能使用这些gcc的编译指示,不知道有关版本的msvc和clang。

它看起来像gcc的push pop编译处理有点破碎。 如果再次启用警告,仍然会收到DISABLE_WARNING / ENABLE_WARNING块内的块的警告。 对于某些版本的gcc它可以工作,对于某些版本不适用。

我有像ROS头一样的外部库的问题。 我喜欢在CMakeLists.txt中使用以下选项进行更严格的编译:

 set(CMAKE_CXX_FLAGS "-std=c++0x -Wall -Wextra -Wstrict-aliasing -pedantic -Werror -Wunreachable-code ${CMAKE_CXX_FLAGS}") 

但是,这样做会导致外部包含的图书馆中的各种迂腐错误。 解决方法是在包含外部库之前禁用所有迂腐警告,然后重新启用:

 //save compiler switches #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" //Bad headers with problem goes here #include <ros/ros.h> #include <sensor_msgs/LaserScan.h> //restore compiler switches #pragma GCC diagnostic pop 

对于那些发现这个页面的人在IAR中寻找一种方法,试试这个:

 #pragma diag_suppress=Pe177 void foo1( void ) { /* The following line of code would normally provoke diagnostic message #177-D: variable "x" was declared but never referenced. Instead, we have suppressed this warning throughout the entire scope of foo1(). */ int x; } #pragma diag_default=Pe177 

请参阅http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472m/chr1359124244797.html以供参考。;

gcc风格通常是使用标准的C语言结构或者__attribute__扩展来告诉编译器更多关于你的意图的方式,而不是沉默警告。 例如,通过将赋值置于括号中,即if ((p=malloc(cnt)))而不是if (p=malloc(cnt)) ,可以抑制作为条件的赋值警告。 关于未使用的函数参数的警告可以被一些奇怪的__attribute__我永远不会记得,或者通过自定义等等)来抑制。但是通常我更喜欢在全局禁用任何警告选项,这些警告选项会以正确的代码生成警告。

Interesting Posts