• 如何优雅的屏蔽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 
     
  • 相关阅读:
    【Zookeeper】分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    【Consul】 分布式环境中的服务注册和发现利器
    springboot集成springsession利用redis来实现session共享
    OpenResty初涉
    java面试之闭包(closure)
    集合框架学习之Guava Collection
    本地缓存
    VLFeat在matlab和vs中安装
    HashCode与Equals回顾
    集合工具类CollectionUtils、ListUtils、SetUtils、MapUtils的使用
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12750890.html
Copyright © 2020-2023  润新知