GCC 警告提示的用法

2022-08-26 01:33:07 字數 4578 閱讀 3501

**gcc 警告提示的用法 

本節主要講解

gcc的警告提示功能。

gcc包含完整的出錯檢查和警告提示功能,它們可以幫助

linux

程式設計師寫出更加專業和優美的**。我們千萬不能小瞧這些警告資訊,在很多情況下,含有警告資訊的**往往會有意想不到的執行結果。

首先可以先看一下以下這段**:

#include

void main(void)

雖然這段**執行的結果是正確的,但還有以下問題。

?main

函式的返回值被宣告為

void

,但實際上應該是

int。

?使用了

gnu語法擴充套件,即使用

long

long

來宣告64

位整數,不符合

ansi/iso

c語言標準。

?main

函式在終止前沒有呼叫

return

語句。gcc

的警告提示選項有很多種型別,主要可分為「-wall」

「-wall」類。

1.

wall

類警告提示

這一類警告提示選項佔了

gcc警告選項的90%以上,它不僅包含開啟所有警告等功能,還可以單獨對常見錯誤分別指定警告,這些常見的警告選項如下表所示(這些選項可供讀者在實際操作時查閱使用)。

選項

作用

-wall                           

開啟所有型別語法警告

,建議讀者養成使用該選項的習慣

-wchar-subscripts                

如果陣列使用

char

型別變數做為下標值的話,則發出警告。因為

在某些平台上可能預設為

signed char

,一旦溢位,就可能導致某

些意外的結果

-wcomment                      

當'/*'

出現在'/*...*/'

注釋中,或者

'\'出現在

'//...'

注釋結尾處時,

使用-wcomment

會給出警告,它很可能會影響程式的執行結果

-wformat                        

檢查printf

和scanf

等格式化輸入輸出函式的格式字串與引數類

型的匹配情況,如果發現不匹配則發出警告。某些時候格式字串

與引數型別的不匹配會導致程式執行錯誤,所以這是個很有用的警告選項

-wimplicit                        

該警告選項實際上是

-wimplicit-int

和-wimplicit-function-declaration

兩個警告選項的集合。前者在宣告函式卻未指明函式返回型別時給出

警告,後者則是在函式宣告前呼叫該函式時給出警告

-wmissing-braces             

當聚合型別或者陣列變數的初始化表示式沒有充分用括號

{}括起時,給出警告

-wparentheses                

這是乙個很有用的警告選項,它能幫助使用者從那些看起來語法正確但卻由於操

作符優先順序或者**結構「障眼

」而導致錯誤執行的**中解脫出來

-wsequence-point             

關於順序點(

sequence

point

),在c

標準中有解釋,不過很晦澀。我

們在平時編碼中盡量避免寫出與實現相關、受實現影響的**便

是了。而

-wsequence-point

選項恰恰可以幫我們這個忙,它可以幫我們

查出這樣的**來,並給出其警告

-wswitch                        

這個選項的功能淺顯易懂,通過文字描述也可以清晰地說明。

當以乙個列舉型別(

enum

)作為switch

語句的索引時但卻沒有

處理default

情況,或者沒有處理所有列舉型別定義範圍內的情況

時,該選項會給出警告

-wunused-function               

警告存在乙個未使用的

static

函式的定義或者存在乙個只宣告卻未定

義的static

函式-wunused-label                 

用來警告存在乙個使用了卻未定義或者存在乙個定義了卻未使用的

label

-wunused-variable              

用來警告存在乙個定義了卻未使用的區域性變數或者非常量

static

變數

-wunused-value                 

用來警告乙個顯式計算表示式的結果未被使用

-wunused-parameter            

用來警告乙個函式的引數在函式的實現中並未被用到

-wuninitialized                  

該警告選項用於檢查乙個區域性自動變數在使用之前是否已經初始化了

longjmp                        

呼叫可能修改乙個

non-volatile

automatic variable

時給出警告

這些警告提示讀者可以根據自己的不同情況進行相應的選擇,這裡最為常用的是」-wall」,上面的這一小段程式使用該警告提示後的結果是:

[root@ft charpter2]#gcc -wall wrong.c -o wrong

wrong.c:4:warning:return type of'main'is not'int'

wrong.c:in function'main':

wrong.c:5:warning:unused variable'tmp'

可以看出,使用」-wall」選項找出了未使用的變數

tmp以及返回值的問題,但沒有找出無效資料型別的錯誤

2.

非wall

類警告提示

非wall

類的警告提示中最為常用的有以下兩種:「-ansi」「-pedantic」

(1)

「-ansi」

該選項強制

gcc生成標準語法所要求的告警資訊,儘管這還並不能保證所有沒有警告的程式都是符合

ansi

c標準的。使用該選項的執行結果如下所示:

[root@ft charpter2]#gcc -ansi wrong.c -o wrong

wrong.c:in function'main':

wrong.c:4:warning:return type of'main'is not'int'

可以看出,該選項並沒有發現

「long long」

這個無效資料型別的錯誤。

(2)

「-pedantic」

該選項允許發出

ansi c

標準所列的全部警告資訊,同樣也

保證所有沒有警告的程式都是符合

ansi

c標準的

使用該選項的執行結果如下所示:

[root@ft charpter2]#gcc -pedantic wrong.c -o wrong

wrong.c:in function'main':

wrong.c:5:warning:iso c90 does not support'long long'

wrong.c:4:warning:return type of'main'is not'int'

可以看出,使用該選項檢視出了

「long long」

這個無效資料型別的錯誤。

gcc的警告提示資訊

gcc包含完整的出錯檢查和警告提示功能。採用 pedantic選項,對於不符合ansi iso標準的源 會產生相應的警告資訊。如 gcc pedantic hello.c o hello main函式返回型別為int,且函式體內要有return 語句,一般為 return 0 pedantic不能保...

提示型警告

朋友告訴我乙個有意思的玩法,利用 prama message給自己提供個提示型警告。include using namespace std define string2 x x define string x string2 x int main 結果編譯的時候,輸出 點選該行,就能知道,這處 你還...

GCC 警告選項 Werror

cc1plus all warnings being treated as errors 解決辦法 只需要找到相應的makefile,去掉編譯選項中的 werror 即可。werror 視警告為錯誤 出現任何警告即放棄編譯.wall 會開啟一些很有用的警告選項,建議編譯時加此選項。wextra 列印...