如何优雅的屏蔽GCC编译器告警

       作为一个合格的C语言程序员,在编译代码的时候一定要加上-W和-Wall选项,要保证代码中没有任何的warning信息,提高代码的可靠性。-Wall选项意思是编译后显示所有警告,-W选项只显示编译器认为会出现错误的警告。

        但是有些时候,有些功能模块尚待开发,有些函数也没有完成功能,虽然不影响程序的正常执行,但是待开发的代码难免会有warning输出。如果去掉编译选项-W和-Wall,整个工程的告警就都会被忽略掉,那么怎么优雅的屏蔽部分代码的告警呢?

#pragma GCC diagnostic ignored "告警类型"

编译如下代码:

#include <stdio.h>

void print_message(char *str, int num)

{

    printf("%s : %d ", str, &num);

    return;

}

int main(int argc, char *argv[])

{

    int i, j, k, t;

    t = 0;

    for(i = 0; i < 3; i++)

    {

        print_message("J value is", j++);

    }

}

编译时加上-Wall选项,会出现如下告警提示:

 

有我们所学的C语言知识可知:

1、-Wformat=:类型不匹配

2、-Wunused-but-set-variable:变量赋值却未使用

3、-Wunused-variable:变量未使用(也没有赋值)

4、-Wreturn-typet:缺少返回值

5、我记得还有一种告警是“变量使用前未初始化”,代码中变量j就属于这种情况,但是不知为何没有告警信息,可能是我编译器版本的问题,或者是这个不会影响程序运行。

接下来我要屏蔽-Wformat=类型的告警:在函数前加上一行预处理命令,新的代码如下:

#include <stdio.h>

#pragma GCC diagnostic ignored "-Wformat="

void print_message(char *str, int num)

{

    printf("%s : %d ", str, &num);

    return;

}

int main(int argc, char *argv[])

{

    int i, j, k, t;

    t = 0;

    for(i = 0; i < 3; i++)

    {

        print_message("J value is", j++);

    }

}

再次编译:

 

可以看到,-Wformat=类型的告警被屏蔽掉了。

当然,我们也可以同时屏蔽多种类型的告警,新的代码如下:

#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#pragma GCC diagnostic ignored "-Wunused-variable"

#pragma GCC diagnostic ignored "-Wformat="

#pragma GCC diagnostic ignored "-Wreturn-type"

void print_message(char *str, int num)

{

    printf("%s : %d ", str, &num);

    return;

}

int main(int argc, char *argv[])

{

    int i, j, k, t;

    t = 0;

    for(i = 0; i < 3; i++)

    {

        print_message("J value is", j++);

    }

}

编译结果如下:

 

可以看到,所有的告警信息都被屏蔽掉了。

现在有一个问题,如果这样写的话,那么在这几行之后所有代码的告警信息都会被屏蔽掉,那么我想在某行之后恢复告警,该怎么做呢?切记,push和pop很好用哦,完整代码如下:

#include <stdio.h>

#pragma GCC diagnostic push

#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#pragma GCC diagnostic ignored "-Wunused-variable"

#pragma GCC diagnostic ignored "-Wformat="

#pragma GCC diagnostic ignored "-Wreturn-type"

void print_message(char *str, int num)

{

    printf("%s : %d ", str, &num);

    return;

}

int main(int argc, char *argv[])

{

    int i, j, k, t;

    t = 0;

    for(i = 0; i < 3; i++)

    {

        print_message("J value is", j++);

    }

}

#pragma GCC diagnostic pop

 

原文:https://www.jianshu.com/p/9939dc4a44fb 
 
原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12750890.html