如何优雅的屏蔽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\n", 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\n", 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\n", 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\n", 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

发表评论