**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 列印...