如何優雅的屏蔽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

 

原文:https://www.jianshu.com/p/9939dc4a44fb 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM