作為廣受歡迎的開源編譯器,GCC(GNU Compiler Collection)已經成為了Linux軟體開發的標配之一。如果你想要進入Linux程式設計的世界,那麼掌握GCC指令是不可或缺的。無論你是初學者還是專業開發人員,GCC都能為你帶來無限的可能性。
gcc 編譯器提供了幾乎數不清的命令列選項清單。當然,沒有人會使用過或精通它所有的命令列選項,但是有一些命令列選項是每一個 gcc 用戶都應該知道的 – 即使不是必須知道。它們中有一些很常用,其他一些不太常用,但不常用並不意味著它們的用處沒前者大。
在這個系列的文章中,我們集中在一些不常用但是很有用的 gcc 命令列選項,在第一節已經講到幾個這樣的命令列選項。
不知道你是否能夠回想起,在這個系列教程的第一部分的開始,我簡要的提到了開發者通常用來產生警告的-Wall 選項,並不包括一些特殊的警告。如果你不了解這些特殊警告,並且不知道如何產生它們,不用擔心,我將在這篇文章中詳細講解關於它們所有的細節。
除此之外,這篇文章也將涉及與浮點值相關的 gcc 警告選項,以及在 gcc 命令列選項列表變得很大的時候如何更好的管理它們。
在繼續之前,請記住,這個教程中的所有範例、命令和指令都已在 Ubuntu 16.04 LTS 作業系統和 gcc 5.4.0 上測試過。
產生 -Wall 選項不包含的警告
#儘管 gcc 編譯器的 -Wall選項涵蓋了絕大多數警告標記,但仍然有一些警告不能產生。為了生成它們,請使用 -Wextra選項。
例如,下面的程式碼:
#include #include int main() { int i=0; /* ... some code here ... */ if(i); return 1; return 0; }
我不小心在 if 條件後面多打了一個分號。現在,如果使用下面的 gcc 指令來進行編譯,不會產生任何警告。
gcc -Wall test.c -o test
#但是如果同時使用-Wextra 選項來進行編譯:gcc -Wall -Wextra test.c -o test
會產生下面這樣一個警告:
test.c: In function ‘main’: test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body] 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 編譯器是否會報出錯誤或警告?讓我們來測試一下:
下面是一段使用 == 運算子進行浮點數值比較的程式碼:
#include void compare(float x, float y) { if(x == y) { printf("/n EQUAL /n"); } } int main(void) { compare(1.234, 1.56789); return 0; }
使用下面的 gcc 指令(包含 -Wall 和 -Wextra 選項)來編譯這段程式碼:
gcc -Wall -Wextra test.c -o test
遺憾的是,上面的指令沒有產生任何與浮點數值比較相關的警告。快速看一下 gcc 手冊,在這種情況下可以使用一個專用的 -Wfloat-equal 選項。
下面是包含這個選項的指令:
gcc -Wall -Wextra -Wfloat-equal test.c -o test
下面是這條指令產生的輸出:
test.c: In function ‘compare’: test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal] if(x == y)
如同上面你所看到的輸出一樣,-Wfloat-equal 選項會強制 gcc 編譯器產生一個與浮點數值比較相關的警告。
這兒是gcc 手冊關於這個選項的說明:
「
#這背後的想法是,有時,對程式設計師來說,把浮點數值考慮成近似無限精確的實數是方便的。如果你這樣做,那麼你需要透過分析程式碼,或其他方式,算出這種計算方式引入的最大或可能的最大誤差,然後進行比較時(以及產生輸出時,不過這是一個不同的問題)允許這個誤差。特別要指出,不應該檢查是否相等,而應該檢查兩個值是否可能出現範圍重疊;這是用關係運算子來做的,所以等值比較可能是搞錯了。
」
#如何更好的管理 gcc 命令列選項
如果在你使用的 gcc 命令中,命令行选项列表变得很大而且很难管理,那么你可以把它放在一个文本文件中,然后把文件名作为 gcc 命令的一个参数。之后,你必须使用@file 命令行选项。
比如,下面这行是你的 gcc 命令:
gcc -Wall -Wextra -Wfloat-equal test.c -o test
然后你可以把这三个和警告相关的选项放到一个文件里,文件名叫做 gcc-options:
$ cat gcc-options
-Wall -Wextra -Wfloat-equal
这样,你的 gcc 命令会变得更加简洁并且易于管理:
gcc @gcc-options test.c -o test
下面是 gcc 手册关于 @file 的说明:
“
从文件中读取命令行选项。读取到的选项随之被插入到原始 @file 选项所在的位置。如果文件不存在或者无法读取,那么这个选项就会被当成文字处理,而不会被删除。
文件中的选项以空格分隔。选项中包含空白字符的话,可以用一个由单引号或双引号包围完整选项。任何字符(包括反斜杠: ‘/’)均可能通过一个 ‘/’ 前缀而包含在一个选项中。如果该文件本身包含额外的 @file选项,那么它将会被递归处理。
”
结论
在这个系列的教程中,我们一共讲解了 5 个不常见但是很有用的 gcc 命令行选项:
-Save-temps -g -Wextra -Wfloat-equal @file
记得花时间练习使用每一个选项,同时不要忘了浏览 gcc 手册上面所提供的关于它们的全部细节。
因此,无论你是正在学习Linux编程,还是已经成为一名经验丰富的开发者,掌握GCC命令将会让你事半功倍。尝试使用GCC命令去编译各种不同的程序,挑战自己的极限,让你的Linux编程之路越来越精彩
以上是GCC指令:解鎖Linux程式設計的無限可能的詳細內容。更多資訊請關注PHP中文網其他相關文章!