gcc 提供了大量的警告選項,對代碼中可能存在的問(wèn)題提出警 告,通??梢允褂?Wall來(lái)開(kāi)啟以下警告:
-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat
-Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration
-Wcomment -Wformat -Wmain (only for C/ObjC and unless
-ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses
-Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point
-Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1
-Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)
-Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value
-Wunused-variable
unused-function:警告聲明但是沒(méi)有定義的static函數;
unused- label:聲明但是未使用的標簽;
unused-parameter:警告未使用的函數參數;
unused-variable:聲明但 是未使用的本地變量;
unused-value:計算了但是未使用的值;
format:printf和scanf這樣的函數中的格式字符 串的使用不當;
implicit-int:未指定類(lèi)型;
implicit-function:函數在聲明前使用;
char- subscripts:使用char類(lèi)作為數組下標(因為char可能是有符號數);
missingbraces:大括號不匹配;
parentheses: 圓括號不匹配;
return-type:函數有無(wú)返回值以及返回值類(lèi)型不匹配;
sequence-point:違反順序點(diǎn)的代碼,比如 a[i] = c[i++];
switch:switch語(yǔ)句缺少default或者switch使用枚舉變量為索引時(shí)缺少某個(gè)變量的case;
strict- aliasing=n:使用n設置對指針變量指向的對象類(lèi)型產(chǎn)生警告的限制程度,默認n=3;只有在-fstrict-aliasing設置的情況下有 效;
unknow-pragmas:使用未知的#pragma指令;
uninitialized:使用的變量為初始化,只在-O2時(shí)有 效;
以下是在-Wall中不會(huì )激活的警告選項:
cast-align:當指針進(jìn)行類(lèi)型轉換后有內存對齊要求更嚴格時(shí)發(fā)出警告;
sign- compare:當使用signed和unsigned類(lèi)型比較時(shí);
missing-prototypes:當函數在使用前沒(méi)有函數原型時(shí);
packed:packed 是gcc的一個(gè)擴展,是使結構體各成員之間不留內存對齊所需的空 間 ,有時(shí)候會(huì )造成內存對齊的問(wèn)題;
padded:也是gcc的擴展,使結構體成員之間進(jìn)行內存對齊的填充,會(huì ) 造成結構體體積增大.
unreachable-code:有不會(huì )執行的代碼時(shí).
inline:當inline函數不再保持inline時(shí) (比如對inline函數取地址);
disable-optimization:當不能執行指定的優(yōu)化時(shí).(需要太多時(shí)間或系統 資源).
可以使用 -Werror時(shí)所有的警告都變成錯誤,使出現警告時(shí)也停止編譯.需要和指定警告的參數一起使用.
優(yōu)化:
gcc默認提供了5級優(yōu) 化選項的集合:
-O0:無(wú)優(yōu)化(默認)
-O和-O1:使用能減少目標文 件 大小以及執行時(shí)間并且不會(huì )使編譯時(shí)間明顯增加的優(yōu)化.在編譯大型程序的時(shí)候會(huì )顯著(zhù)增加編譯時(shí)內存的使用.
-O2: 包含-O1的優(yōu)化并增加了不需要在目標文件大小和執行速度上進(jìn)行折衷的優(yōu)化.編譯器不執行循環(huán)展開(kāi)以及函數內聯(lián).此選項將增加編譯時(shí)間和目標文件的執行性 能.
-Os:專(zhuān)門(mén)優(yōu)化目標文件大小,執行所有的不增加目標文件大小的-O2優(yōu)化選項.并且執行專(zhuān)門(mén)減小目標文件大小的優(yōu)化選項.
-O3: 打開(kāi)所有-O2的優(yōu)化選項并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize優(yōu)化選項.
-O1包含的選項-O1通??梢园踩暮驼{試的選項一起使用:
-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch
-fdse -fguess-branch-probability -fif-conversion2 -fif-conversion
-finline-small-functions -fipa-pure-const -fipa-reference
-fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch
-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse
-ftree-fre -ftree-sra -ftree-ter -funit-at-a-time
以下所有的優(yōu)化選項需要在名字 前加上-f,如果不需要此選項可以使用-fno-前綴
defer-pop:延遲到只在必要時(shí)從函數參數棧中pop參數;
thread- jumps:使用跳轉線(xiàn)程優(yōu)化,避免跳轉到另一個(gè)跳轉;
branch-probabilities:分支優(yōu)化;
cprop- registers:使用寄存器之間copy-propagation傳值;
guess-branch-probability:分支預測;
omit- frame-pointer:可能的情況下不產(chǎn)生棧幀;
-O2:以下是-O2在-O1基礎上增加的優(yōu)化選項:
-falign-functions -falign-jumps -falign-loops -falign-labels
-fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks
-fdelete-null-pointer-checks -fexpensive-optimizations -fgcse
-fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove
-freorder-blocks -freorder-functions -frerun-cse-after-loop
-fsched-interblock -fsched-spec -fschedule-insns
-fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre
-ftree-vrp
cpu架構的優(yōu)化選項,通常是-mcpu(將被取消);-march,-mtune
Debug選項:
在 gcc編譯源代碼時(shí)指定-g選項可以產(chǎn)生帶有調試信息的目標代碼,gcc可以為多個(gè)不同平臺上帝不同調試器提供調試信息,默認gcc產(chǎn)生的調試信息是為 gdb使用的,可以使用-gformat 指定要生成的調試信息的格式以提供給其他平臺的其他調試器使用.常用的格式有
-ggdb:生成gdb專(zhuān) 用的調試信息,使用最適合的格式(DWARF 2,stabs等)會(huì )有一些gdb專(zhuān)用的擴展,可能造成其他調試器無(wú)法運行.
-gstabs:使用 stabs格式,不包含gdb擴展,stabs常用于BSD系統的DBX調試器.
-gcoff:產(chǎn)生COFF格式的調試信息,常用于System V下的SDB調試器;
-gxcoff:產(chǎn)生XCOFF格式的調試信息,用于IBM的RS/6000下的DBX調試器;
-gdwarf- 2:產(chǎn)生DWARF version2 的格式的調試信息,常用于IRIXX6上的DBX調試器.GCC會(huì )使用DWARF version3的一些特性.
可 以指定調試信息的等級:在指定的調試格式后面加上等級:
如: -ggdb2 等,0代表不產(chǎn)生調試信息.在使用-gdwarf-2時(shí)因為最早的格式為-gdwarf2會(huì )造成混亂,所以要額外使用一個(gè)-glevel來(lái)指定調試信息的 等級,其他格式選項也可以另外指定等級.
gcc可以使用-p選項指定生成信息以供porf使用.
選項
含義
--help
--target-help
顯示 gcc 幫助說(shuō)明?!畉arget-help’是顯示目標機器特定的命令行選項。
--version
顯示 gcc 版本號和版權信息 。
-o outfile
輸出到指定的文件。
-x language
指明使用的編程語(yǔ)言。允許的語(yǔ)言包括:c c++ assembler none 。 ‘none’意味著(zhù)恢復默認行為,即根據文件的擴展名猜測源文件的語(yǔ)言。
-v
打印較多信息,顯示編譯器調用的程序。
-###
與 -v 類(lèi)似,但選項被引號括住,并且不執行命令。
-E
僅作預處理,不進(jìn)行編譯、匯編和鏈接。如上圖所示。
-S
僅編譯到匯編語(yǔ)言,不進(jìn)行匯編和鏈接。如上圖所示。
-c
編譯、匯編到目標代碼,不進(jìn)行鏈接。如上圖所示。
-pipe
使用管道代替臨時(shí)文件。
-combine
將多個(gè)源文件一次性傳遞給匯編器。
更多有用的GCC選項:
命令
描述
-l library
-llibrary
進(jìn)行鏈接時(shí)搜索名為library的庫。
例子: $ gcc test.c -lm -o test
-Idir
把dir 加入到搜索頭文件的路徑列表中。
例子: $ gcc test.c -I../inc -o test
-Ldir
把dir 加入到搜索庫文件的路徑列表中。
例子: $ gcc -I/home/foo -L/home/foo -ltest test.c -o test
-Dname
預定義一個(gè)名為name 的宏,值為1。
例子: $ gcc -DTEST_CONFIG test.c -o test
-Dname =definition
預定義名為name ,值為definition 的宏。
-ggdb
-ggdblevel
為調試器 gdb 生成調試信息。level 可以為1,2,3,默認值為2。
-g
-glevel
生成操作系統本地格式的調試信息。-g 和 -ggdb 并不太相同, -g 會(huì )生成 gdb 之外的信息。level 取值同上。
-s
去除可執行文件中的符號表和重定位信息。用于減小可執行文件的大小。
-M
告訴預處理器輸出一個(gè)適合make的規則,用于描述各目標文件的依賴(lài)關(guān)系。對于每個(gè) 源文件,預處理器輸出 一個(gè)make規則,該規則的目標項(target)是源文件對應的目標文件名,依賴(lài)項(dependency)是源文件中 `#include引用的所有文件。生成的規則可 以是單行,但如果太長(cháng),就用`\'-換行符續成多行。規則 顯示在標準輸出,不產(chǎn)生預處理過(guò)的C程序。
-C
告訴預處理器不要丟棄注釋。配合`-E'選項使用。
-P
告訴預處理器不要產(chǎn)生`#line'命令。配合`-E'選項使用。
-static
在支持動(dòng)態(tài)鏈接的系統上,阻止連接共享庫。該選項在其它系統上 無(wú)效。
-nostdlib
不連接系統標準啟動(dòng)文件和標準庫文件,只把指定的文件傳遞給連接器。
Warnings
-Wall
會(huì )打開(kāi)一些很有用的警告選項,建議編譯時(shí)加此選項。
-W
-Wextra
打印一些額外的警告信息。
-w
禁止顯示所有警告信息。
-Wshadow
當一個(gè)局部變量遮蓋住了另一個(gè)局部變量,或者全局變量時(shí),給出警告。很有用的選項,建議打開(kāi)。 -Wall 并不會(huì )打開(kāi)此項。
-Wpointer-arith
對函數指針或者void *類(lèi)型的指針進(jìn)行算術(shù)操作時(shí)給出警告。也很有用。 -Wall 并不會(huì )打開(kāi)此項。
-Wcast-qual
當強制轉化丟掉了類(lèi)型修飾符時(shí)給出警告。 -Wall 并不會(huì )打開(kāi)此項。
-Waggregate-return
如果定義或調用了返回結構體或聯(lián)合體的函數,編譯器就發(fā)出警告。
-Winline
無(wú)論是聲明為 inline 或者是指定了-finline-functions 選項,如果某函數不能內聯(lián),編譯器都將發(fā)出警告。如果你的代碼含有很多 inline 函數的話(huà),這是很有用的選項。
-Werror
把警告當作錯誤。出現任何警告就放棄編譯。
-Wunreachable-code
如果編譯器探測到永遠不會(huì )執行到的代碼,就給出警告。也是比較有用的選項。
-Wcast-align
一旦某個(gè)指針類(lèi)型強制轉換導致目標所需的地址對齊增加時(shí),編譯器就發(fā)出警告。
-Wundef
當一個(gè)沒(méi)有定義的符號出現在 #if 中時(shí),給出警告。
-Wredundant-decls
如果在同一個(gè)可見(jiàn)域內某定義多次聲明,編譯器就發(fā)出警告,即使這些重復聲明有效并且毫無(wú)差別。
Optimization
-O0
禁止編譯器進(jìn)行優(yōu)化。默認為此項。
-O
-O1
嘗試優(yōu)化編譯時(shí)間和可執行文件大小。
-O2
更多的優(yōu)化,會(huì )嘗試幾乎全部的優(yōu)化功能,但不會(huì )進(jìn)行“空間換時(shí)間”的優(yōu)化方法。
-O3
在 -O2 的基礎上再打開(kāi)一些優(yōu)化選項:-finline-functions, -funswitch-loops 和 -fgcse-after-reload 。
-Os
對生成文件大小進(jìn)行優(yōu)化。它會(huì )打開(kāi) -O2 開(kāi)的全部選項,除了會(huì )那些增加文件大小的。
-finline-functions
把所有簡(jiǎn)單的函數內聯(lián)進(jìn)調用者。編譯器會(huì )探索式地決定哪些函數足夠簡(jiǎn)單,值得做這種內聯(lián)。
-fstrict-aliasing
施加最強的別名規則(aliasing rules)。
Standard
-ansi
支持符合ANSI標準的C程序。這樣就會(huì )關(guān)閉GNU C中某些不兼容ANSI C的特性。
-std=c89
-iso9899:1990
指明使用標準 ISO C90 作為標準來(lái)編譯程序。
-std=c99
-std=iso9899:1999
指明使用標準 ISO C99 作為標準來(lái)編譯程序。
-std=c++98
指明使用標準 C++98 作為標準來(lái)編譯程序。
-std=gnu9x
-std=gnu99
使用 ISO C99 再加上 GNU 的一些擴展。
-fno-asm
不把asm, inline或typeof當作關(guān)鍵字,因此這些詞可以用做標識符。用 __asm__, __inline__和__typeof__能夠替代它們。 `-ansi' 隱含聲明了`-fno-asm'。
-fgnu89-inline
告訴編譯器在 C99 模式下看到 inline 函數時(shí)使用傳統的 GNU 句法。
C options
-fsigned-char
-funsigned-char
把char定義為有/無(wú)符號類(lèi)型,如同signed char/unsigned char。
-traditional
嘗試支持傳統C編譯器的某些方面。詳見(jiàn)GNU C手冊。
-fno-builtin
-fno-builtin-function
不接受沒(méi)有 __builtin_ 前綴的函數作為內建函數。
-trigraphs
支持ANSI C的三聯(lián)符( trigraphs)。`-ansi'選項隱含聲明了此選項。
-fsigned-bitfields
-funsigned-bitfields
如果沒(méi)有明確聲明`signed'或`unsigned'修飾符,這些選項用來(lái)定義有符號位域或無(wú)符號位域。缺省情況下,位域是有符號的,因為它們繼承的基本整數類(lèi)型,如int,是有符號數。
-Wstrict-prototypes
如果函數的聲明或定義沒(méi)有指出參數類(lèi)型,編譯器就發(fā)出警告。很有用的警告。
-Wmissing-prototypes
如果沒(méi)有預先聲明就定義了全局函數,編譯器就發(fā)出警告。即使函數定義自身提供了函數原形也會(huì )產(chǎn)生這個(gè)警告。這個(gè)選項 的目的是檢查沒(méi)有在頭文件中聲明的全局函數。
-Wnested-externs
如果某extern聲明出現在函數內部,編譯器就發(fā)出警告。
C++ options
-ffor-scope
從頭開(kāi)始執行程序,也允許進(jìn)行重定向。
-fno-rtti
關(guān)閉對 dynamic_cast 和 typeid 的支持。如果你不需要這些功能,關(guān)閉它會(huì )節省一些空間。
-Wctor-dtor-privacy
當一個(gè)類(lèi)沒(méi)有用時(shí)給出警告。因為構造函數和析構函數會(huì )被當作私有的。
-Wnon-virtual-dtor
當一個(gè)類(lèi)有多態(tài)性,而又沒(méi)有虛析構函數時(shí),發(fā)出警告。-Wall會(huì )開(kāi)啟這個(gè)選項。
-Wreorder
如果代碼中的成員變量的初始化順序和它們實(shí)際執行時(shí)初始化順序不一致,給出警告。
-Wno-deprecated
使用過(guò)時(shí)的特性時(shí)不要給出警告。
-Woverloaded-virtual
如果函數的聲明隱藏住了基類(lèi)的虛函數,就給出警告。
Machine Dependent Options (Intel)
-mtune=cpu-type
為指定類(lèi)型的 CPU 生成代碼。cpu-type 可以是:i386,i486,i586,pentium,i686,pentium4 等等。
-msse
-msse2
-mmmx
-mno-sse
-mno-sse2
-mno-mmx
使用或者不使用MMX,SSE,SSE2指令。
-m32
-m64
生成32位/64位機器上的代碼。
-mpush-args
-mno-push-args
(不)使用 push 指令來(lái)進(jìn)行存儲參數。默認是使用。
-mregparm=num
當傳遞整數參數時(shí),控制所使用寄存器的個(gè)數。
聯(lián)系客服