不常見可是頗有用的 GCC 命令行選項(二)

導讀 gcc 編譯器提供了幾乎數不清的命令行選項列表。固然,沒有人會使用過或者精通它全部的命令行選項,可是有一些命令行選項是每個 gcc 用戶都應該知道的 - 即便不是必須知道。它們中有一些很經常使用,其餘一些不太經常使用,但不經常使用並不意味着它們的用處沒前者大。

回顧html

在這個系列的文章中,咱們集中於一些不經常使用可是頗有用的 gcc 命令行選項,在第一節已經講到幾個這樣的命令行選項。linux

不知道你是否可以回想起,在這個系列教程的第一部分的開始,我簡要的提到了開發者們一般用來生成警告的 -Wall 選項,並不包括一些特殊的警告。若是你不瞭解這些特殊警告,而且不知道如何生成它們,不用擔憂,我將在這篇文章中詳細講解關於它們全部的細節。程序員

除此之外,這篇文章也將涉及與浮點值相關的 gcc 警告選項,以及在 gcc 命令行選項列表變得很大的時候如何更好的管理它們。數組

在繼續以前,請記住,這個教程中的全部例子、命令和指令都已在 Ubuntu 16.04 LTS 操做系統和 gcc 5.4.0 上測試過。ide

生成 -Wall 選項不包括的警告函數

儘管 gcc 編譯器的 -Wall 選項涵蓋了絕大多數警告標記,依然有一些警告不能生成。爲了生成它們,請使用 -Wextra 選項。測試

好比,下面的代碼:操作系統

1.#include 
2.#include 
3.int main()
4.{
5.    int i=0;
6.    /* ...
7.       some code here 
8.       ...
9.    */
10.
11.    if(i);
12.        return 1;
13.     return 0; 
14.}

我不當心在 if 條件後面多打了一個分號。如今,若是使用下面的 gcc 命令來進行編譯,不會生成任何警告。.net

1.gcc -Wall test.c -o test

可是若是同時使用 -Wextra 選項來進行編譯:命令行

1.gcc -Wall -Wextra test.c -o test

會生成下面這樣一個警告:

1.test.c: In function ‘main’:
2.test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
3. if(i);

從上面的警告清楚的看到, -Wextra 選項從內部啓用了 -Wempty-body 選項,從而能夠檢測可疑代碼並生成警告。下面是這個選項啓用的所有警告標記。

•-Wclobbered
•-Wempty-body
•-Wignored-qualifiers
•-Wmissing-field-initializers
•-Wmissing-parameter-type (僅針對 C 語言)
•-Wold-style-declaration (僅針對 C 語言)
•-Woverride-init
•-Wsign-compare
•-Wtype-limits
•-Wuninitialized
•-Wunused-parameter (只有和 -Wunused 或 -Wall 選項使用時纔會啓用)
•-Wunused-but-set-parameter (只有和-Wunused或-Wall` 選項使用時纔會生成)

若是想對上面所提到的標記有更進一步的瞭解,請查看 gcc 手冊。

此外,遇到下面這些狀況, -Wextra 選項也會生成警告:
•一個指針和整數 0 進行 < , <=, >, 或 >= 比較
•(僅 C++)一個枚舉類型和一個非枚舉類型同時出如今一個條件表達式中
•(僅 C++)有歧義的虛擬基底
•(僅 C++)寄存器類型的數組加下標
•(僅 C++)對寄存器類型的變量進行取址
•(僅 C++)基類沒有在派生類的複製構建函數中進行初始化

浮點值的等值比較時生成警告

你可能已經知道,浮點值不能進行確切的相等比較(若是不知道,請閱讀與浮點值比較相關的 FAQ)。可是若是你不當心這樣作了, gcc 編譯器是否會報出錯誤或警告?讓咱們來測試一下:

下面是一段使用 == 運算符進行浮點值比較的代碼:

1.#include
2.
3.void compare(float x, float y)
4.{
5.    if(x == y)
6.    {
7.        printf("\n EQUAL \n");
8.    }
9.}
10.
11.int main(void)
12.{
13.    compare(1.234, 1.56789);
14.
15.    return 0; 
16.}

使用下面的 gcc 命令(包含 -Wall 和 -Wextra 選項)來編譯這段代碼:

1.gcc -Wall -Wextra test.c -o test

遺憾的是,上面的命令沒有生成任何與浮點值比較相關的警告。快速看一下 gcc 手冊,在這種情形下可使用一個專用的 -Wfloat-equal 選項。

下面是包含這個選項的命令:

1.gcc -Wall -Wextra -Wfloat-equal test.c -o test

下面是這條命令產生的輸出:

1.test.c: In function ‘compare’:
2.test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
3. if(x == y)

正如上面你所看到的輸出那樣, -Wfloat-equal 選項會強制 gcc 編譯器生成一個與浮點值比較相關的警告。

這兒是gcc 手冊關於這一選項的說明:

"這背後的想法是,有時,對程序員來講,把浮點值考慮成近似無限精確的實數是方便的。若是你這樣作,那麼你須要經過分析代碼,或者其餘方式,算出這種計算方式引入的最大或可能的最大偏差,而後進行比較時(以及產生輸出時,不過這是一個不一樣的問題)容許這個偏差。特別要指出,不該該檢查是否相等,而應該檢查兩個值是否可能出現範圍重疊;這是用關係運算符來作的,因此等值比較多是搞錯了。"

如何更好的管理 gcc 命令行選項

若是在你使用的 gcc 命令中,命令行選項列表變得很大並且很難管理,那麼你能夠把它放在一個文本文件中,而後把文件名做爲 gcc 命令的一個參數。以後,你必須使用 @file 命令行選項。

好比,下面這行是你的 gcc 命令:

1.gcc -Wall -Wextra -Wfloat-equal test.c -o test

而後你能夠把這三個和警告相關的選項放到一個文件裏,文件名叫作 gcc-options:

1.$ cat gcc-options 
2.-Wall -Wextra -Wfloat-equal

這樣,你的 gcc 命令會變得更加簡潔而且易於管理:

1.gcc @gcc-options test.c -o test

下面是 gcc 手冊關於 @file 的說明:

"從文件中讀取命令行選項。讀取到的選項隨之被插入到原始 @file 選項所在的位置。若是文件不存在或者沒法讀取,那麼這個選項就會被當成文字處理,而不會被刪除。

文件中的選項以空格分隔。選項中包含空白字符的話,能夠用一個由單引號或雙引號包圍完整選項。任何字符(包括反斜槓: '\')都可能經過一個 '\' 前綴而包含在一個選項中。若是該文件自己包含額外的 @file 選項,那麼它將會被遞歸處理。
"

結論

在這個系列的教程中,咱們一共講解了 5 個不常見可是頗有用的 gcc 命令行選項: -Save-temps、-g、 -Wextra、-Wfloat-equal 以及 @file。記得花時間練習使用每個選項,同時不要忘了瀏覽 gcc 手冊上面所提供的關於它們的所有細節。

你是否知道或使用其餘像這樣有用的 gcc 命令行選項,並但願把它們在全世界範圍內分享?請在下面的評論區留下全部的細節。

原文來自:https://linux.cn/article-8032-1.html

本文地址: http://www.linuxprobe.com/usual-gcc-command.html

相關文章
相關標籤/搜索