GNU GCC 手冊(2)

 

GCC 2

Section: GNU Tools (1)
Updated: 2003/12/05


預處理器選項(Preprocessor Option)

下列選項針對C預處理器,預處理器用在正式編譯以前,C 源文件進行某種處理.

如果指定了`-E'選項, GCC只進行預處理工作.下面的某些選項必須和`-E'選項一起才 有意義,因爲他們的輸出結果不能用於編譯.

 

-include file
在處理常規輸入文件之前,首先處理文件file,其結果是,文件file的內容先得到編譯. 命令行上任何`-D'`-U'選項永遠在`-include file'之前處理, 無論他們在命令行上的順序如何.然而`-include'`-imacros'選項按書寫順序處理.

 

-imacros file
在處理常規輸入文件之前,首先處理文件file,但是忽略輸出結果.由於丟棄了文件file的 輸出內容, `-imacros file'選項的唯一效果就是使文件file中的宏定義生效, 可以用於其他輸入文件.在處理`-imacrosfile'選項之前,預處理器首先處理`-D' `-U'選項,並不在乎他們在命令行上的順序.然而`-include'`-imacros'選項按書寫順序處理.

 

-idirafter dir
把目錄dir添加到第二包含路徑中.如果某個頭文件在主包含路徑(`-I'添加的路徑)中沒有 找到,預處理器就搜索第二包含路徑.

 

-iprefix prefix
指定prefix作爲後續`-iwithprefix'選項的前綴.

 

-iwithprefix dir
把目錄添加到第二包含路徑中.目錄名由prefixdir合併而成,這裏 prefix被先前的`-iprefix'選項指定.

 

-nostdinc
不要在標準系統目錄中尋找頭文件.只搜索`-I'選項指定的目錄(以及當前目錄,如果合適).

結合使用`-nostdinc'`-I-'選項,你可以把包含文件搜索限制在顯式指定的目錄.

 

-nostdinc++
不要在C++專用標準目錄中尋找頭文件,但是仍然搜索其他標準目錄. (當建立`libg++'時使用 這個選項.)
-undef
不要預定義任何非標準宏. (包括系統結構標誌).

 

-E
僅運行C預處理器.預處理所有指定的C源文件,結果送往標準輸出或指定的輸出文件.

 

-C
告訴預處理器不要丟棄註釋.配合`-E'選項使用.

 

-P
告訴預處理器不要產生`#line'命令.配合`-E'選項使用.

 

-M  [ -MG ]
告訴預處理器輸出一個適合make的規則,用於描述各目標文件的依賴關係.對於每個源文件,預處理器輸出 一個make規則,該規則的目標項(target)是源文件對應的目標文件名,依賴項(dependency)是源文件中 `#include引用的所有文件.生成的規則可以是單行,但如果太長,就用`/'-換行符續成多行.規則 顯示在標準輸出,不產生預處理過的C程序.

`-M'隱含了`-E'選項.

`-MG'要求把缺失的頭文件按存在對待,並且假定他們和源程序文件在同一目錄下.必須和 `-M'選項一起用.

 

-MM  [ -MG ]
`-M'選項類似,但是輸出結果僅涉及用戶頭文件,象這樣`#include file"'.忽略系統頭文件如`#include <file>'.

 

-MD
`-M'選項類似,但是把依賴信息輸出在文件中,文件名通過把輸出文件名末尾的`.o'替換爲 `.d'產生.同時繼續指定的編譯工作---`-MD'不象`-M'那樣阻止正常的編譯任務.

Mach的實用工具`md'能夠合併`.d'文件,產生適用於`make'命令的單一的 依賴文件.

 

-MMD
`-MD'選項類似,但是輸出結果僅涉及用戶頭文件,忽略系統頭文件.

 

-H
除了其他普通的操作, GCC顯示引用過的頭文件名.

 

-Aquestion(answer)
如果預處理器做條件測試,`#if #question(answer)',該選項可以斷言(Assert) question的答案是answer. -A-'關閉一般用於描述目標機的標準斷言.

 

-Dmacro
定義宏macro,宏的內容定義爲字符串`1'.

 

-Dmacro=defn
定義宏macro的內容爲defn.命令行上所有的`-D'選項在 `-U'選項之前處理.

 

-Umacro
取消宏macro. `-U'選項在所有的`-D'選項之後處理,但是優先於任何 `-include'`-imacros'選項.

 

-dM
告訴預處理器輸出有效的宏定義列表(預處理結束時仍然有效的宏定義).該選項需結合`-E'選項使用.

 

-dD
告訴預處理器把所有的宏定義傳遞到輸出端,按照出現的順序顯示.

 

-dN
`-dD'選項類似,但是忽略宏的參量或內容.只在輸出端顯示`#define name.

 

彙編器選項(ASSEMBLER OPTION)

-Wa,option
把選項option傳遞給彙編器.如果option含有逗號,就在逗號處分割成多個選項.

 

連接器選項(LINKER OPTION)

下面的選項用於編譯器連接目標文件,輸出可執行文件的時候.如果編譯器不進行 連接,他們就毫無意義.

 

object-file-name
如果某些文件沒有特別明確的後綴a special recognized suffix, GCC就認爲他們是目標文件或庫文件. (根據文件內容,連接器能夠區分目標文件和庫文件).如果GCC執行連接操作,這些目標文件將成爲連接器的輸入文件.

 

-llibrary
連接名爲library的庫文件.

連接器在標準搜索目錄中尋找這個庫文件,庫文件的真正名字是`liblibrary.a'.連接器會 當做文件名得到準確說明一樣引用這個文件.

搜索目錄除了一些系統標準目錄外,還包括用戶以`-L'選項指定的路徑.

一般說來用這個方法找到的文件是庫文件---即由目標文件組成的歸檔文件(archive file).連接器處理歸檔文件的 方法是:掃描歸檔文件,尋找某些成員,這些成員的符號目前已被引用,不過還沒有被定義.但是,如果連接器找到普通的 目標文件,而不是庫文件,就把這個目標文件按平常方式連接進來.指定`-l'選項和指定文件名的唯一區別是, `-l選項用`lib'`.a'library包裹起來,而且搜索一些目錄.

 

-lobjc
這個-l選項的特殊形式用於連接Objective C程序.

 

-nostartfiles
不連接系統標準啓動文件,而標準庫文件仍然正常使用.

 

-nostdlib
不連接系統標準啓動文件和標準庫文件.只把指定的文件傳遞給連接器.

 

-static
在支持動態連接(dynamic linking)的系統上,阻止連接共享庫.該選項在其他系統上無效.

 

-shared
生成一個共享目標文件,他可以和其他目標文件連接產生可執行文件.只有部分系統支持該選項.

 

-symbolic
建立共享目標文件的時候,把引用綁定到全局符號上.對所有無法解析的引用作出警告(除非用連接編輯選項 `-Xlinker -z -Xlinker defs'取代).只有部分系統支持該選項.

 

 

-Xlinker option
把選項option傳遞給連接器.可以用他傳遞系統特定的連接選項, GNU CC無法識別這些選項.

如果需要傳遞攜帶參數的選項,你必須使用兩次`-Xlinker',一次傳遞選項,另一次傳遞他的參數. 例如,如果傳遞`-assert definitions',你必須寫成`-Xlinker -assert -Xlinker definitions',而不能寫成`-Xlinker "-assert definitions"',因爲這樣會把整個 字符串當做一個參數傳遞,顯然這不是連接器期待的.

 

-Wl,option
把選項option傳遞給連接器.如果option中含有逗號,就在逗號處分割成多個選項.

 

-u symbol
使連接器認爲取消了symbol的符號定義,從而連接庫模塊以取得定義.你可以使用多個 `-u'選項,各自跟上不同的符號,使得連接器調入附加的庫模塊.

 

目錄選項(DIRECTORY OPTION)

下列選項指定搜索路徑,用於查找頭文件,庫文件,或編譯器的某些成員:

-Idir
在頭文件的搜索路徑列表中添加dir 目錄.

 

-I-
任何在`-I-'前面用`-I'選項指定的搜索路徑只適用於`#include "file"'這種情況;他們不能用來搜索`#include <file>'包含的頭文件.

如果用`-I'選項指定的搜索路徑位於`-I-'選項後面,就可以在這些路徑中搜索所有的 `#include'指令. (一般說來-I選項就是這麼用的.)

還有, `-I-'選項能夠阻止當前目錄(存放當前輸入文件的地方)成爲搜索`#include "file"'的第一選擇.沒有辦法克服`-I-'選項的這個效應.你可以指定 `-I.'搜索那個目錄,它在調用編譯器時是當前目錄.這和預處理器的默認行爲不完全一樣,但是結果通常 令人滿意.

`-I-'不影響使用系統標準目錄,因此, `-I-'`-nostdinc'是不同的選項.

 

-Ldir
`-l'選項的搜索路徑列表中添加dir目錄.

 

-Bprefix
這個選項指出在何處尋找可執行文件,庫文件,以及編譯器自己的數據文件.

編譯器驅動程序需要執行某些下面的子程序: `cpp', `cc1' (C++`cc1plus'), `as'`ld'.他把prefix當作欲執行的程序的 前綴,既可以包括也可以不包括`machine/version/'.

對於要運行的子程序,編譯器驅動程序首先試着加上`-B'前綴(如果存在).如果沒有找到文件,或沒有指定 `-B'選項,編譯器接着會試驗兩個標準前綴`/usr/lib/gcc/'`/usr/local/lib/gcc-lib/'.如果仍然沒能夠找到所需文件,編譯器就在`PATH'環境變量 指定的路徑中尋找沒加任何前綴的文件名.

如果有需要,運行時(run-time)支持文件`libgcc.a'也在`-B'前綴的搜索範圍之內. 如果這裏沒有找到,就在上面提到的兩個標準前綴中尋找,僅此而已.如果上述方法沒有找到這個文件,就不連接他了.多數 情況的多數機器上, `libgcc.a'並非必不可少.

你可以通過環境變量GCC_EXEC_PREFIX獲得近似的效果;如果定義了這個變量,其值就和上面說的 一樣用做前綴.如果同時指定了`-B'選項和GCC_EXEC_PREFIX變量,編譯器首先使用 `-B'選項,然後才嘗試環境變量值.

 

警告選項(WARNING OPTION)

警告是針對程序結構的診斷信息,程序不一定有錯誤,而是存在風險,或者可能存在 錯誤.

下列選項控制GNU CC產生的警告的數量和類型:

 

-fsyntax-only
檢查程序中的語法錯誤,但是不產生輸出信息.
-w
禁止所有警告信息.
-Wno-import
禁止所有關於#import的警告信息.
-pedantic
打開完全服從ANSI C標準所需的全部警告診斷;拒絕接受採用了被禁止的語法擴展的程序.

無論有沒有這個選項,符合ANSI C標準的程序應該能夠被正確編譯(雖然極少數程序需要`-ansi' 選項).然而,如果沒有這個選項,某些GNU擴展和傳統C特性也得到支持.使用這個選項可以拒絕這些程序.沒有理由 使用這個選項,他存在只是爲了滿足一些書呆子(pedant).

對於替選關鍵字(他們以`__'開始和結束) `-pedantic'不會產生警告信息. Pedantic 也不警告跟在__extension__後面的表達式.不過只應該在系統頭文件中使用這種轉義措施,應用程序最好 避免.

-pedantic-errors
該選項和`-pedantic'類似,但是顯示錯誤而不是警告.
-W
對下列事件顯示額外的警告信息:
   *
非易變自動變量(nonvolatile automatic variable)可能在調用longjmp時發生改變. 這些警告僅在優化編譯時發生.

編譯器只知道對setjmp的調用,他不可能知道會在哪裏調用longjmp,事實上一個 信號處理例程可以在程序的任何地點調用他.其結果是,即使程序沒有問題,你也可能會得到警告,因爲無法在可能出現問題 的地方調用longjmp.

 

   *
既可以返回值,也可以不返回值的函數. (缺少結尾的函數體被看作不返回函數值)例如,下面的函數將導致這種警告:

 

foo (a)
{
  if (a > 0)
    return a;
}


由於GNU CC不知道某些函數永不返回(含有abortlongjmp),因此有可能出現 虛假警告.

 

   *
表達式語句或逗號表達式的左側沒有產生作用(side effect).如果要防止這種警告,應該把未使用的表達式強制轉換 爲void類型.例如,這樣的表達式`x[i,j]'會導致警告,`x[(void)i,j]'就不會.

 

   *
無符號數用`>'`<='和零做比較.

 

 

-Wimplicit-int
警告沒有指定類型的聲明.

 

-Wimplicit-function-declaration
警告在聲明之前就使用的函數.

 

-Wimplicit
-Wimplicit-int-Wimplicit-function-declaration.

 

-Wmain
如果把main函數聲明或定義成奇怪的類型,編譯器就發出警告.典型情況下,這個函數用於外部連接, 返回int數值,不需要參數,或指定兩個參數.

 

-Wreturn-type
如果函數定義了返回類型,而默認類型是int,編譯器就發出警告.同時警告那些不帶返回值的 return語句,如果他們所屬的函數並非void類型.

 

-Wunused
如果某個局部變量除了聲明就沒再使用,或者聲明瞭靜態函數但是沒有定義,或者某條語句的運算結果顯然沒有使用, 編譯器就發出警告.

 

-Wswitch
如果某條switch語句的參數屬於枚舉類型,但是沒有對應的case語句使用枚舉元素,編譯器 就發出警告. ( default語句的出現能夠防止這個警告.)超出枚舉範圍的case語句同樣會 導致這個警告.

 

-Wcomment
如果註釋起始序列`/*'出現在註釋中,編譯器就發出警告.

 

-Wtrigraphs
警告任何出現的trigraph (假設允許使用他們).

 

-Wformat
檢查對printfscanf等函數的調用,確認各個參數類型和格式串中的一致.

 

-Wchar-subscripts
警告類型是char的數組下標.這是常見錯誤,程序員經常忘記在某些機器上char有符號.

 

-Wuninitialized
在初始化之前就使用自動變量.

這些警告只可能做優化編譯時出現,因爲他們需要數據流信息,只有做優化的時候才估算數據流信息.如果不指定 `-O'選項,就不會出現這些警告.

這些警告僅針對等候分配寄存器的變量.因此不會發生在聲明爲volatile的變量上面,不會發生在已經 取得地址的變量,或長度不等於1, 2, 4, 8字節的變量.同樣也不會發生在結構,聯合或數組上面,即使他們在 寄存器中.

注意,如果某個變量只計算了一個從未使用過的值,這裏可能不會警告.因爲在顯示警告之前,這樣的計算已經被 數據流分析刪除了.

這些警告作爲可選項是因爲GNU CC還沒有智能到判別所有的情況,知道有些看上去錯誤的代碼其實是正確的.下面是 一個這樣的例子:

 

{
  int x;
  switch (y)
    {
    case 1: x = 1;
      break;
    case 2: x = 4;
      break;
    case 3: x = 5;
    }
  foo (x);
}


如果y始終是1, 23,那麼x總會被初始化,但是GNU CC不知道這一點.下面是 另一個普遍案例:

 

{
  int save_y;
  if (change_y) save_y = y, y = new_y;
  ...
  if (change_y) y = save_y;
}


這裏沒有錯誤,因爲只有設置了save_y才使用他.

把所有不返回的函數定義爲volatile可以避免某些似是而非的警告.

 

-Wparentheses
在某些情況下如果忽略了括號,編譯器就發出警告.

 

-Wtemplate-debugging
當在C++程序中使用template的時候,如果調試(debugging)沒有完全生效,編譯器就發出警告. (僅用於C++).

 

-Wall
結合所有上述的`-W'選項.通常我們建議避免這些被警告的用法,我們相信,恰當結合宏的使用能夠 輕易避免這些用法。

 

剩下的`-W...'選項不包括在`-Wall',因爲我們認爲在必要情況下,這些被編譯器警告 的程序結構,可以合理的用在"乾淨的"程序中.

 

-Wtraditional
如果某些程序結構在傳統C中的表現和ANSI C不同,編譯器就發出警告.

 

   *
宏參出現在宏體的字符串常量內部.傳統C會替換宏參,ANSI C則視其爲常量的一部分.

 

   *
某個函數在塊(block)中聲明爲外部,但在塊結束後才調用.

 

   *
switch語句的操作數類型是long.

 

 

-Wshadow
一旦某個局部變量屏蔽了另一個局部變量,編譯器就發出警告.

 

-Wid-clash-len
一旦兩個確定的標識符具有相同的前len個字符,編譯器就發出警告.他可以協助你開發一些將要在某些 過時的,危害大腦的編譯器上編譯的程序.

 

-Wpointer-arith
任何語句如果依賴於函數類型的大小(size)或者void類型的大小,編譯器就發出警告. GNU C爲了 便於計算void *指針和函數指針,就把這些類型的大小定義爲1.

 

-Wcast-qual
一旦某個指針強制類型轉換以便移除類型修飾符時,編譯器就發出警告.例如,如果把const char * 強制轉換爲普通的char *,警告就會出現.

 

-Wcast-align
一旦某個指針類型強制轉換時,導致目標所需的地址對齊(alignment)增加,編譯器就發出警告.例如,某些機器上 只能在24字節邊界上訪問整數,如果在這種機型上把char *強制轉換成int *類型, 編譯器就發出警告.

 

-Wwrite-strings
規定字符串常量的類型是const char[length],因此,把這樣的地址複製給 non-const char *指針將產生警告.這些警告能夠幫助你在編譯期間發現企圖寫入字符串常量 的代碼,但是你必須非常仔細的在聲明和原形中使用const,否則他們只能帶來麻煩;所以我們沒有讓 `-Wall'提供這些警告.

 

-Wconversion
如果某函數原形導致的類型轉換和無函數原形時的類型轉換不同,編譯器就發出警告.這裏包括定點數和浮點數的 互相轉換,改變定點數的寬度或符號,除非他們和缺省聲明(default promotion)相同.

 

-Waggregate-return
如果定義或調用了返回結構或聯合的函數,編譯器就發出警告. (從語言角度你可以返回一個數組,然而同樣會 導致警告.)

 

-Wstrict-prototypes
如果函數的聲明或定義沒有指出參數類型,編譯器就發出警告. (如果函數的前向引用說明指出了參數類型,則允許後面 使用舊式風格的函數定義,而不會產生警告.)

 

-Wmissing-prototypes
如果沒有預先聲明函數原形就定義了全局函數,編譯器就發出警告.即使函數定義自身提供了函數原形也會產生這個警告. 他的目的是檢查沒有在頭文件中聲明的全局函數.

 

-Wmissing-declarations
如果沒有預先聲明就定義了全局函數,編譯器就發出警告.即使函數定義自身提供了函數原形也會產生這個警告.這個選項 的目的是檢查沒有在頭文件中聲明的全局函數.

 

-Wredundant-decls
如果在同一個可見域某定義多次聲明,編譯器就發出警告,即使這些重複聲明有效並且毫無差別.

 

-Wnested-externs
如果某extern聲明出現在函數內部,編譯器就發出警告.

 

-Wenum-clash
對於不同枚舉類型之間的轉換髮出警告(僅適用於C++).

 

-Wlong-long
如果使用了long long 類型就發出警告.該警告是缺省項.使用`-Wno-long-long' 選項能夠防止這個警告. `-Wlong-long'`-Wno-long-long'僅在 `-pedantic'之下才起作用.

 

-Woverloaded-virtual
(僅適用於C++.)在繼承類中,虛函數的定義必須匹配虛函數在基類中聲明的類型特徵(type signature).當 繼承類聲明瞭某個函數,它可能是個錯誤的嘗試企圖定義一個虛函數,使用這個選項能夠產生警告:就是說,當某個函數和基 中的虛函數同名,但是類型特徵不符合基類的任何虛函數,編譯器將發出警告.

 

-Winline
如果某函數不能內嵌(inline),無論是聲明爲inline或者是指定了-finline-functions 選項,編譯器都將發出警告.

 

-Werror
視警告爲錯誤;出現任何警告即放棄編譯.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章