作为一个合格的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