很有用的 GCC 命令列選項
在這個系列的文章中,我們集中於一些不常用但是很有用的 gcc 命令列選項,在第一節已經講到幾個這樣的命令列選項。
不知道你是否能夠回想起,在這個系列教程的第一部分的開始,我簡要的提到了開發者們通常用來生成警告的-Wall 選項,並不包括一些特殊的警告。如果你不瞭解這些特殊警告,並且不知道如何生成它們,不用擔心,我將在這篇文章中詳細講解關於它們所有的細節。
除此以外,這篇文章也將涉及與浮點值相關的 gcc 警告選項,以及在 gcc 命令列選項列表變得很大的時候如何更好的管理它們。
在繼續之前,請記住,這個教程中的所有例子、命令和指令都已在 Ubuntu 16.04 LTS 作業系統和 gcc 5.4.0 上測試過。
儘管 gcc 編譯器的 -Wall選項涵蓋了絕大多數警告標記,依然有一些警告不能生成。為了生成它們,請使用 -Wextra選項。
比如,下面的程式碼:
#include <stdio.h> #include <stdlib.h> 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<stdio.h> 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 命令的一個引數。之後,你必須使用@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 手冊上面所提供的關於它們的全部細節。
你是否知道或使用其他像這樣有用的 gcc 命令列選項,並希望把它們在全世界範圍內分享?請在下面的評論區留下所有的細節。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2948541/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSP201403-3:命令列選項命令列
- pflag - 更好的PHP命令列選項解析庫PHP命令列
- Node.js 構建命令列工具:實現 ls 命令的 -a 和 -l 選項Node.js命令列
- tcpdump 命令的常用選項:一TCP
- tcpdump 命令的常用選項:二TCP
- tcpdump 命令的常用選項:三TCP
- GCC命令詳解GC
- tcpdump 命令的個常用選項:一TCP
- tcpdump 命令的個常用選項:三TCP
- tcpdump 命令的個常用選項:二TCP
- cmdr 03 - 用流式介面定義命令列引數處理選項命令列
- gcc或g++的編譯選項 -shared -fPIC 與 -g -rdynamic 部分轉載GC編譯
- vim命令列模式有哪些引數選項?如何學習linux系統命令列模式Linux
- Linux 中grep命令中 -P選項的作用Linux
- 有用 AT 命令測試過晶片的嗎?晶片
- 10個 ssh 簡單命令選項
- 在Linux中,ls命令有哪些常用的選項?Linux
- 完全解析Rsync命令的17個備份選項
- 命令列gcc -v和g++ -v輸出版本不一致命令列GC
- asciinema —— 一款對開發者很方便的命令列錄製工具ASCII命令列
- 非常有用的Linux系統操作命令Linux
- 啟用命令選項板工具:Paletro for MacMac
- Linux 中 sed命令 h和H選項的應用Linux
- [雪峰磁針石部落格]python庫介紹-argparse:命令列選項及引數解析Python命令列
- 在 Linux 下 9 個有用的 touch 命令示例Linux
- Python命令列引數定義及注意事項Python命令列
- 十分有用的壓箱底的正則例項
- 不點之Linux命令、選項及檔案概念Linux
- Electron-vue開發實戰7——命令列呼叫與系統級別右鍵選單項的實現Vue命令列
- 用於建立連線的命令選項(參考MySQL官方文件)MySql
- Linux中sed命令b選項遮蔽指定的處理區域Linux
- PG12中新增:VACUUM命令的SKIP_LOCKED選項
- 觀察下面的選項,選出正確的選項。
- 不會用“函式選項模式”的朋友看過來,這麼寫很優雅函式模式
- 掛載檔案系統mount命令引數選項-linux命令入門Linux
- Linux下tar命令的各種引數選項和他們的作用整理Linux
- Win10列印首選項如何設定_win10印表機首選項的設定步驟Win10
- windows命令列命令Windows命令列