作為一個合格的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
原文:https://www.jianshu.com/p/9939dc4a44fb