G ++忽略忽略_Pragma诊断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了G ++忽略忽略_Pragma诊断相关的知识,希望对你有一定的参考价值。

我试图在从宏扩展的代码中禁用g ++警告。根据我的理解,_Pragma应该遵循宏用法,这不应该在用Wparentheses编译时触发g++

#include <stdio.h>

#define TEST(expr) 
    int a = 1; 
    _Pragma( "GCC diagnostic push" ) 
    _Pragma( "GCC diagnostic ignored "-Wparentheses"" ) 
    if (a <= expr) { 
        printf("filler
"); 
    } 
    _Pragma( "GCC diagnostic pop" )

int main(){
    int b = 2, c = 3;
    TEST(b == c);
}

当我用g++编译它时,我得到Wparentheses警告,我试图禁用它。

xarn@DESKTOP-B2A3CNC:/mnt/c/ubuntu$ g++ -Wall -Wextra test3.c
test3.c: In function ‘int main()’:
test3.c:8:11: warning: suggest parentheses around comparison in operand of ‘==’ [-Wparentheses]
     if (a <= expr) { 
           ^
test3.c:15:5: note: in expansion of macro ‘TEST’
     TEST(b == c);
     ^

但是,当使用gcc时,它按预期工作:

xarn@DESKTOP-B2A3CNC:/mnt/c/ubuntu$ gcc -Wall -Wextra test3.c
test3.c: In function ‘main’:
test3.c:16:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

我使用的是g++版本4.8.5。

答案

通常,您仅使用警告抑制来处理来自第三方代码的不可避免的警告,因此它们不会使编译日志混乱。在你的情况下,它会更好

1)使用常规函数,因为宏是邪恶的

2)通过在可能破坏的表达式周围添加圆括号来处理警告

if (a <= (expr)) { 
另一答案

在使用gcc前端的g ++处理_Pragmas时存在长期存在的缺陷。唯一的解决方案是要么转到足够现代的g ++版本(IIRC 6+),要么禁用整个TU的警告。

以上是关于G ++忽略忽略_Pragma诊断的主要内容,如果未能解决你的问题,请参考以下文章

编译器处理警告错误 #pragma GCC diagnostic ignored "-Wunused"

各个层次的gcc警告

c# https请求忽略证书验证_各种编程语言忽略http的SSL证书认证

可以将 GCC 配置为忽略 #pragma 指令吗?

Eclipse提交svn代码要忽略哪些包

Webpack 在目标节点时忽略代码拆分