自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不常見但是很有用的gcc命令行選項(xiàng)(二)

系統(tǒng) Linux
gcc 編譯器提供了幾乎數(shù)不清的命令行選項(xiàng)列表。當(dāng)然,沒有人會使用過或者精通它所有的命令行選項(xiàng),但是有一些命令行選項(xiàng)是每一個(gè) gcc 用戶都應(yīng)該知道的 - 即使不是必須知道。它們中有一些很常用,其他一些不太常用,但不常用并不意味著它們的用處沒前者大。

gcc 編譯器提供了幾乎數(shù)不清的命令行選項(xiàng)列表。當(dāng)然,沒有人會使用過或者精通它所有的命令行選項(xiàng),但是有一些命令行選項(xiàng)是每一個(gè) gcc 用戶都應(yīng)該知道的 - 即使不是必須知道。它們中有一些很常用,其他一些不太常用,但不常用并不意味著它們的用處沒前者大。

[[178960]]

在這個(gè)系列的文章中,我們集中于一些不常用但是很有用的 gcc 命令行選項(xiàng),在***節(jié)已經(jīng)講到幾個(gè)這樣的命令行選項(xiàng)。

不知道你是否能夠回想起,在這個(gè)系列教程的***部分的開始,我簡要的提到了開發(fā)者們通常用來生成警告的 -Wall 選項(xiàng),并不包括一些特殊的警告。如果你不了解這些特殊警告,并且不知道如何生成它們,不用擔(dān)心,我將在這篇文章中詳細(xì)講解關(guān)于它們所有的細(xì)節(jié)。

除此以外,這篇文章也將涉及與浮點(diǎn)值相關(guān)的 gcc 警告選項(xiàng),以及在 gcc 命令行選項(xiàng)列表變得很大的時(shí)候如何更好的管理它們。

在繼續(xù)之前,請記住,這個(gè)教程中的所有例子、命令和指令都已在 Ubuntu 16.04 LTS 操作系統(tǒng)和 gcc 5.4.0 上測試過。

生成 -Wall 選項(xiàng)不包括的警告

盡管 gcc 編譯器的 -Wall 選項(xiàng)涵蓋了絕大多數(shù)警告標(biāo)記,依然有一些警告不能生成。為了生成它們,請使用 -Wextra 選項(xiàng)。

比如,下面的代碼:

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. int main() 
  4.     int i=0; 
  5.     /* ... 
  6.        some code here  
  7.        ... 
  8.     */ 
  9.     if(i); 
  10.         return 1; 
  11.      return 0;  

我不小心在 if 條件后面多打了一個(gè)分號?,F(xiàn)在,如果使用下面的 gcc 命令來進(jìn)行編譯,不會生成任何警告。

  1. gcc -Wall test.c -o test 

但是如果同時(shí)使用 -Wextra 選項(xiàng)來進(jìn)行編譯:

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

會生成下面這樣一個(gè)警告:

  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 選項(xiàng)從內(nèi)部啟用了 -Wempty-body 選項(xiàng),從而可以檢測可疑代碼并生成警告。下面是這個(gè)選項(xiàng)啟用的全部警告標(biāo)記。

  • -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 選項(xiàng)使用時(shí)才會啟用)
  • -Wunused-but-set-parameter (只有和-Wunused或-Wall` 選項(xiàng)使用時(shí)才會生成)

如果想對上面所提到的標(biāo)記有更進(jìn)一步的了解,請查看 gcc 手冊。

此外,遇到下面這些情況, -Wextra 選項(xiàng)也會生成警告:

  • 一個(gè)指針和整數(shù) 0 進(jìn)行 <, <=, >, 或 >= 比較
  • (僅 C++)一個(gè)枚舉類型和一個(gè)非枚舉類型同時(shí)出現(xiàn)在一個(gè)條件表達(dá)式中
  • (僅 C++)有歧義的虛擬基底
  • (僅 C++)寄存器類型的數(shù)組加下標(biāo)
  • (僅 C++)對寄存器類型的變量進(jìn)行取址
  • (僅 C++)基類沒有在派生類的復(fù)制構(gòu)建函數(shù)中進(jìn)行初始化

浮點(diǎn)值的等值比較時(shí)生成警告

你可能已經(jīng)知道,浮點(diǎn)值不能進(jìn)行確切的相等比較(如果不知道,請閱讀與浮點(diǎn)值比較相關(guān)的 FAQ)。但是如果你不小心這樣做了, gcc 編譯器是否會報(bào)出錯(cuò)誤或警告?讓我們來測試一下:

下面是一段使用 == 運(yùn)算符進(jìn)行浮點(diǎn)值比較的代碼:

  1. #include<stdio.h> 
  2. void compare(float x, float y) 
  3.     if(x == y) 
  4.     { 
  5.         printf("\n EQUAL \n"); 
  6.     } 
  7. int main(void) 
  8.     compare(1.234, 1.56789); 
  9.     return 0;  

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

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

遺憾的是,上面的命令沒有生成任何與浮點(diǎn)值比較相關(guān)的警告??焖倏匆幌?gcc 手冊,在這種情形下可以使用一個(gè)專用的 -Wfloat-equal 選項(xiàng)。

下面是包含這個(gè)選項(xiàng)的命令: 

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

下面是這條命令產(chǎn)生的輸出:

  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 選項(xiàng)會強(qiáng)制 gcc 編譯器生成一個(gè)與浮點(diǎn)值比較相關(guān)的警告。

這兒是gcc 手冊關(guān)于這一選項(xiàng)的說明:

這背后的想法是,有時(shí),對程序員來說,把浮點(diǎn)值考慮成近似***精確的實(shí)數(shù)是方便的。如果你這樣做,那么你需要通過分析代碼,或者其他方式,算出這種計(jì)算方式引入的***或可能的***誤差,然后進(jìn)行比較時(shí)(以及產(chǎn)生輸出時(shí),不過這是一個(gè)不同的問題)允許這個(gè)誤差。特別要指出,不應(yīng)該檢查是否相等,而應(yīng)該檢查兩個(gè)值是否可能出現(xiàn)范圍重疊;這是用關(guān)系運(yùn)算符來做的,所以等值比較可能是搞錯(cuò)了。

如何更好的管理 gcc 命令行選項(xiàng)

如果在你使用的 gcc 命令中,命令行選項(xiàng)列表變得很大而且很難管理,那么你可以把它放在一個(gè)文本文件中,然后把文件名作為 gcc 命令的一個(gè)參數(shù)。之后,你必須使用 @file 命令行選項(xiàng)。

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

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

然后你可以把這三個(gè)和警告相關(guān)的選項(xiàng)放到一個(gè)文件里,文件名叫做 gcc-options:

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

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

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

下面是 gcc 手冊關(guān)于 @file 的說明:

從文件中讀取命令行選項(xiàng)。讀取到的選項(xiàng)隨之被插入到原始 @file 選項(xiàng)所在的位置。如果文件不存在或者無法讀取,那么這個(gè)選項(xiàng)就會被當(dāng)成文字處理,而不會被刪除。

文件中的選項(xiàng)以空格分隔。選項(xiàng)中包含空白字符的話,可以用一個(gè)由單引號或雙引號包圍完整選項(xiàng)。任何字符(包括反斜杠: '\')均可能通過一個(gè) '\' 前綴而包含在一個(gè)選項(xiàng)中。如果該文件本身包含額外的 @file 選項(xiàng),那么它將會被遞歸處理。

結(jié)論

在這個(gè)系列的教程中,我們一共講解了 5 個(gè)不常見但是很有用的 gcc 命令行選項(xiàng): -Save-temps、-g、 -Wextra、-Wfloat-equal 以及 @file。記得花時(shí)間練習(xí)使用每一個(gè)選項(xiàng),同時(shí)不要忘了瀏覽 gcc 手冊上面所提供的關(guān)于它們的全部細(xì)節(jié)。

你是否知道或使用其他像這樣有用的 gcc 命令行選項(xiàng),并希望把它們在全世界范圍內(nèi)分享?請?jiān)谙旅娴脑u論區(qū)留下所有的細(xì)節(jié)。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2016-12-14 19:19:19

Linuxgcc命令行

2010-06-24 16:18:49

Linux Chatt

2021-07-06 11:25:20

Chrome前端代碼

2021-10-21 22:03:00

PythonNumpy函數(shù)

2021-06-29 10:50:30

Python函數(shù)文件

2018-01-24 18:30:53

瀏覽器Firefox命令行

2010-06-01 19:24:40

SVN命令行

2010-10-12 17:13:43

MySQL命令行

2014-04-08 15:05:11

LinuxLinux命令行補(bǔ)全命令

2010-07-30 09:07:12

PHP函數(shù)

2021-08-17 10:34:19

Python數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)

2013-08-23 09:28:37

GitGit 命令

2019-10-18 09:25:45

Python蘋果公司算法

2015-10-08 09:01:51

2010-07-15 12:45:30

Perl命令行

2010-07-20 14:27:46

Perl命令行

2021-08-19 14:27:56

Java應(yīng)用程序解析方法

2015-07-01 09:15:46

linuxQuora命令行

2010-11-01 14:01:32

DB2命令行

2010-02-05 11:00:33

Ubuntu GCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號