GCC(1)

NAME
gcc, g++ - GNU 工程的 C 和 C++ 編譯器 (egcs-1.1.2)

總覽 (SYNOPSIS)
gcc [ option | filename ]...
g++ [ option | filename ]...

警告 (WARNING)
本手冊頁 內容 摘自 GNU C 編譯器 的 完整文件, 僅限於 解釋 選項 的 含義.

除非 有人 自願 維護, 否則 本手冊頁 不再 更新. 如果 發現 手冊頁 和 軟體 之間 有所矛盾, 請 查對 Info 檔案, Info 檔案 是 權威 文件.

如果 我們 發覺 本手冊頁 的 內容 由於 過時 而 導致 明顯 的 混亂 和 抱怨 時, 我們 就 停止 發佈 它. 不可能有 其他 選擇, 像 更新 Info 檔案 同時 更新 man 手冊, 因為 其他 維護 GNU CC 的 工作 沒有 留給 我們 時間 做 這個. GNU 工程 認為 man 手冊 是 過時產物, 應該 把 時間 用到 別的地方.

如果 需要 完整 和 最新 的 文件, 請 查閱 Info 檔案 `gcc ' 或 Using and Porting GNU CC (for version 2.0) (使用和移植 GNU CC 2.0) 手冊. 二者 均 來自 Texinfo 原檔案 gcc.texinfo.

描述 (DESCRIPTION)
C 和 C++ 編譯器 是 集成的. 他們 都要 用 四個步驟 中的 一個 或 多個 處理 輸入檔案: 預處理(preprocessing), 編譯(compilation), 匯編(assembly) 和 連接(linking). 源檔案延伸檔名名 標識 源檔案 的 語言, 但是 對 編譯器 來說, 延伸檔名名 控制著 預設設定:

gcc 認為 預處理後的 檔案 (.i ) 是 C 檔案, 並且 設定 C 形式 的 連接.

g++ 認為 預處理後的 檔案 (.i ) 是 C++ 檔案, 並且 設定 C++ 形式 的 連接.

源檔案延伸檔名名 指出 語言種類 以及 後期 的 操作:

.c	C 源程式; 預處理, 編譯, 匯編
.C	C++ 源程式; 預處理, 編譯, 匯編
.cc	C++ 源程式; 預處理, 編譯, 匯編
.cxx	C++ 源程式; 預處理, 編譯, 匯編
.m	Objective-C 源程式; 預處理, 編譯, 匯編
.i	預處理後的 C 檔案; 編譯, 匯編
.ii	預處理後的 C++ 檔案; 編譯, 匯編
.s	匯編語言源程式; 匯編
.S	匯編語言源程式; 預處理, 匯編
.h	預處理器檔案; 通常 不出現在 命令行 上

其他 延伸檔名名 的 檔案 被傳遞 給 連接器(linker). 通常 包括:

.o	目標檔案 (Object file)
.a	歸檔庫檔案 (Archive file)

除非 使用了 -c, -S, 或 -E 選項 (或者 編譯錯誤 阻止了 完整 的 過程), 否則 連接 總是 最後的步驟. 在 連接階段 中, 所有 對應於 源程式 的 .o 檔案, -l 庫檔案, 無法 識別 的 檔名 (包括 指定的 .o 目標檔案 和 .a 庫檔案) 按 命令行中 的 順序 傳遞給 連接器.

選項 (OPTIONS)
選項 必須 分立 給出: `-dr ' 完全 不同於 `-d -r '.

大多數 `-f ' 和 `-W ' 選項 有 兩個 相反 的 格式: -fname 和 -fno-name (或 -Wname 和 -Wno-name ). 這裏 只列舉 不是 預設選項 的 格式.

下面 是 所有 選項 的 摘要, 按 類型 分組, 解釋 放在 後面 的 章節 中.

總體選項 (Overall Option)
    -c -S -E -o file -pipe -v -x language

語言選項 (Language Option)
    -ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs

警告選項 (Warning Option)
    -fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings

調試選項 (Debugging Option)
    -a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program

優化選項 (Optimization Option)
    -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3

預處理器選項 (Preprocessor Option)
    -Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef

匯編器選項 (Assembler Option)
    -Wa,option

連接器選項 (Linker Option)
    -llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol

目錄選項 (Directory Option)
    -Bprefix -Idir -I- -Ldir

目標機選項 (Target Option)
    -b machine -V version

配置相關選項 (Configuration Dependent Option)
    M680x0 選項
    -m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-float

    VAX 選項
    -mg -mgnu -munix

    SPARC 選項
    -mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypress

    Convex 選項
    -margcount -mc1 -mc2 -mnoargcount

    AMD29K 選項
    -m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registers

    M88K 選項
    -m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structs

    RS6000 選項
    -mfp-in-toc -mno-fop-in-toc

    RT 選項
    -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-return

    MIPS 選項
    -mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocpp

    i386 選項
    -m486 -mno-486 -msoft-float -mno-fp-ret-in-387

    HPPA 選項
    -mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-colon

    i960 選項
    -mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align

    DEC Alpha 選項
    -mfp-regs -mno-fp-regs -mno-soft-float -msoft-float

    System V 選項
    -G -Qy -Qn -YP,paths -Ym,dir

代碼生成選項 (Code Generation Option)
    -fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm

總體選項 (Overall Option)

-x language
    明確 指出 後面 輸入檔案 的 語言 為 language (而不是 從 檔名延伸檔名 得到的 預設選擇). 這個選項 應用於 後面 所有的 輸入檔案, 直到 遇著 下一個 `-x ' 選項. language 的 可選值 有 `c ', `objective-c ', `c-header ', `c++ ', `cpp-output ', `assembler ', 和 `assembler-with-cpp '.

-x none
    關閉 任何 對 語種 的 明確說明, 因此 依據 檔名延伸檔名 處理 後面 的 檔案 (就像是 從未 使用過 `-x ' 選項).

如果 只操作 四個階段 (預處理, 編譯, 匯編, 連接) 中的 一部分, 可以 使用 `-x ' 選項 (或 檔名延伸檔名) 告訴 gcc 從 哪裏 開始, 用 `-c ', `-S ', 或 `-E ' 選項 告訴 gcc 到 哪裏 結束. 注意, 某些 選項組合 (例如, `-x cpp-output -E ') 使 gcc 不作 任何事情.

-c  編譯 或 匯編 源檔案, 但是 不作 連接. 編譯器 輸出 對應於 源檔案 的 目標檔案.

    預設情況下, GCC 通過 用 `.o ' 替換 源檔名延伸檔名 `.c ', `.i ', `.s ', 等等, 產生 目標檔名. 可以 使用 -o 選項 選擇 其他 名字.

    GCC 忽略 -c 選項 後面 任何 無法 識別 的 輸入檔案 (他們 不需要 編譯 或 匯編).

-S  編譯 後 即停止, 不進行 匯編. 對於 每個 輸入的 非匯編語言 檔案, 輸出檔案 是 匯編語言 檔案.

    預設情況下, GCC 通過 用 `.o ' 替換 源檔名延伸檔名 `.c ', `.i ', 等等, 產生 目標檔名. 可以 使用 -o 選項 選擇 其他 名字.

    GCC 忽略 任何 不需要 編譯 的 輸入檔案.

-E  預處理 後 即停止, 不進行 編譯. 預處理後的 代碼 送往 標準輸出.

    GCC 忽略 任何 不需要 預處理 的 輸入檔案.

-o file
    指定 輸出檔案 為 file . 該選項 不在乎 GCC 產生 什麼 輸出, 無論是 可執行檔案, 目標檔案, 匯編檔案 還是 預處理後的 C 代碼.

    由於 只能 指定 一個 輸出檔案, 因此 編譯 多個 輸入檔案 時, 使用 `-o ' 選項 沒有 意義, 除非 輸出 一個 可執行檔案.

    如果 沒有 使用 `-o ' 選項, 預設的 輸出 結果 是: 可執行檔案 為 `a.out ', `source . suffix ' 的 目標檔案 是`source .o ', 匯編檔案 是 `source .s ', 而 預處理後的 C 原始碼 送往 標準輸出.

-v  (在 標準錯誤) 顯示 執行 編譯 階段 的 命令. 同時 顯示 編譯器 驅動程式, 預處理器, 編譯器 的 版本號.

-pipe
    在 編譯過程 的 不同 階段 間 使用 管道 而非 臨時檔案 進行 通信. 這個 選項 在 某些 系統 上 無法 工作, 因為 那些 系統 的 匯編器 不能 從 管道 讀取 數據. GNU 的 匯編器 沒有 這個問題.

語言選項 (LANGUAGE OPTIONS)
下列 選項 控制 編譯器 能夠 接受 的 C "方言":

-ansi
    支持 符合 ANSI 標準的 C 程式.

    這樣 就會 關閉 GNU C 中 某些 不相容 ANSI C 的 特性, 例如 asm , inline 和 typeof 關鍵字, 以及 諸如 unix 和 vax 這些 表明 當前系統 類型 的 預定義宏. 同時 開啟 不受歡迎 和 極少使用的 ANSI trigraph 特性, 以及 禁止 `$ ' 成為 標識符 的 一部分.

    儘管 使用了 `-ansi ' 選項, 下面 這些 可選的 關鍵字, __asm__ , __extension__ , __inline__ 和 __typeof__ 仍然 有效. 你 當然 不會 把 他們 用在 ANSI C 程式 中, 但可以 把 他們 放在 頭檔案 裏, 因為 編譯 包含 這些 頭檔案 的 程式 時, 可能會 指定 `-ansi ' 選項. 另外一些 預定義宏, 如 __unix__ 和 __vax__ , 無論 有沒有 使用 `-ansi ' 選項, 始終 有效.

    使用 `-ansi ' 選項 不會 自動 拒絕 編譯 非ANSI程式, 除非 增加 `-pedantic ' 選項 作為 `-ansi ' 選項 的 補充.

    使用 `-ansi ' 選項 的 時候, 預處理器 會 預定義 一個 __STRICT_ANSI__ 宏. 有些 頭檔案 關注 此宏, 以 避免 聲明 某些函數, 或者 避免 定義 某些宏, 這些 函數 和 宏 不被 ANSI 標準 調用; 這樣 就不會 幹擾 在 其他地方 使用 這些 名字 的 程式 了.

-fno-asm
    不把 asm , inline 或 typeof 當作 關鍵字, 因此 這些 詞 可以 用做 標識符. 用 __asm__ , __inline__ 和 __typeof__ 能夠 替代 他們. `-ansi ' 隱含聲明了 `-fno-asm '.

-fno-builtin
    不接受 不是 兩個 下劃線 開頭 的 內建函數 (built-in function). 目前 受影響 的 函數 有 _exit , abort , abs , alloca , cos , exit , fabs , labs , memcmp , memcpy , sin , sqrt , strcmp , strcpy , 和 strlen .

    `-ansi ' 選項 能夠 阻止 alloca 和 _exit 成為 內建函數.

-fhosted
    按 宿主環境 編譯; 他 隱含 聲明了 `-fbuiltin ' 選項, 而且 警告 不正確的 main 函數 聲明.

-ffreestanding
    按 獨立環境 編譯; 他 隱含 聲明了 `-fno-builtin ' 選項, 而且 對 main 函數 沒有 特別要求. (譯注: 宿主環境 (hosted environment) 下 所有的 標準庫 可用, main 函數 返回 一個 int 值, 典型例子 是 除了 核心 以外 幾乎 所有的 程式. 對應的 獨立環境 (freestanding environment) 不存在 標準庫, 程式 入口 也 不一定是 main, 最明顯 的 例子 就是 作業系統核心. 詳情 參考 gcc 網站 最近的 資料)

-fno-strict-prototype
    對於 沒有 參數 的 函數聲明, 例如 `int foo ();', 按 C 風格 處理—即 不說明 參數 個數 或 類型. (僅針對 C++). 正常情況下, 這樣的 函數 foo 在 C++ 中 意味著 參數 為 空.

-trigraphs
    支持 ANSI C trigraphs. `-ansi ' 選項 隱含聲明了 `-trigraphs '.

-traditional
    試圖 支持 傳統 C 編譯器 的 某些方面. 詳見 GNU C 手冊, 我們 已經把 細節清單 從這裏 刪除, 這樣 當內容 過時後, 人們 也不會 埋怨 我們.

    除了 一件事: 對於 C++ 程式 (不是 C), `-traditional ' 選項 帶來 一個 附加效應, 允許 對 this 賦值. 他 和 `-fthis-is-variable ' 選項 的 效果 一樣.

-traditional-cpp
    試圖 支持 傳統 C 預處理器 的 某些方面. 特別是 上面 提到 有關 預處理器 的 內容, 但是 不包括 `-traditional ' 選項 的 其他 效應.

-fdollars-in-identifiers
    允許 在 標識符(identifier) 中 使用 `$ ' 字符 (僅針對 C++). 你 可以 指定 `-fno-dollars-in-identifiers ' 選項 顯明 禁止 使用 `$ ' 符. (GNU C++ 在 某些 目標系統 預設允許 `$ ' 符, 但不是 所有系統.)

-fenum-int-equiv
    允許 int 類型 到 枚舉類型 (enumeration) 的 隱式轉換 (僅限於 C++). 正常情況下 GNU C++ 允許 從 enum 到 int 的 轉換, 反之則 不行.

-fexternal-templates
    為 模板聲明 (template declaration) 產生 較小的 代碼 (僅限於 C++), 方法 是 對於 每個 模板函數 (template function), 只在 定義 他們 的 地方 生成 一個 副本. 想要 成功 使用 這個選項, 你 必須 在 所有 使用 模板 的 檔案 中, 標記 `#pragma implementation ' (定義) 或 `#pragma interface ' (聲明). 當 程式 用 `-fexternal-templates ' 編譯 時, 模板實例 (template instantiation) 全部是 外部類型. 你 必須 讓 需要的 實例 在 實現檔案 中 出現. 可以 通過 typedef 實現 這一點, 他 引用 所需的 每個 實例. 相對應的, 如果 編譯時 使用 預設選項 `-fno-external-templates ', 所有 模板實例 明確的 設為 內置.

-fall-virtual
    所有 可能的 成員函數 預設為 虛函數. 所有的 成員函數 (除了 構造子函數 和 new 或 delete 成員操作符) 視為 所在類 的 虛函數.

    這 不表明 每次 調用 成員函數 都將 通過 內部 虛函數表. 有些 情況 下, 編譯器 能夠 判斷出 可以 直接 調用 某個 虛函數; 這時 就 直接 調用.

-fcond-mismatch
    允許 條件表達式 的 第二 和 第三個 參數 的 類型 不匹配. 這種 表達式 的 值 是 void.

-fthis-is-variable
    允許 對 this 賦值 (僅對 C++). 合並 使用者自定義 的 自由存儲管理 機制 到 C++ 後, 使 可賦值 的 `this ' 顯得 不合時宜. 因此, 預設 情況 下, 類成員函數 內部 對 this 賦值 是 無效操作. 然而 為了 向後相容, 你 可以 通過 `-fthis-is-variable ' 選項 使 這種 操作 有效.

-funsigned-char
    把 char 定義為 無符號 類型, 如同 unsigned char .

    各種 機器 都有 自己 預設的 char 類型. 既 可能 是 unsigned char 也 可能是 signed char .

    理想情況下, 當 依賴於 數據的 符號性 時, 一個 可移植程式 總是 應該 使用 signed char 或 unsigned char . 但是 許多 程式 已經 寫成 只用 簡單的 char , 並且 期待 這是 有符號數 (或者 無符號數, 具體情況 取決於 編寫 程式 的 目標機器). 這個選項, 和 它的 反義選項, 使 那樣的 程式 工作在 對應的 預設值 上.

    char 的 類型 始終 應該 明確定義 為 signed char 或 unsigned char , 即使 它 表現的 和 其中之一 完全一樣.

-fsigned-char
    把 char 定義為 有符號 類型, 如同 signed char .

    這個 選項 等同於 `-fno-unsigned-char ', 他是 the negative form of `-funsigned-char ' 的 相反 選項. 同樣, `-fno-signed-char ' 等價於 `-funsigned-char '.

-fsigned-bitfields

-funsigned-bitfields

-fno-signed-bitfields

-fno-unsigned-bitfields
    如果 沒有 明確 聲明 `signed ' 或 `unsigned ' 修飾符, 這些 選項 用來 定義 有符號位域 (bitfield) 或 無符號位域. 預設情況下, 位域 是 有符號 的, 因為 他們 繼承的 基本 整數類型, 如 int , 是 有符號數.

    然而, 如果 指定了 `-traditional ' 選項, 位域 永遠 是 無符號數.

-fwritable-strings
    把 字符串常量 存儲到 可寫數據段, 而且 不做 特別 對待. 這是 為了 相容 一些 老程式, 他們 假設 字符串常量 是 可寫的. `-traditional ' 選項 也有 相同 效果.

    篡改 字符串常量 是一個 非常 糟糕的 想法; “常量” 就應該是 常量.

預處理器選項 (Preprocessor Option)
下列 選項 針對 C 預處理器, 預處理器 用在 正式 編譯 以前, 對 C 源檔案 進行 某種處理.

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

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

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

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

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

-iwithprefix dir
    把 目錄 添加到 第二包含路徑 中. 目錄名 由 prefix 和 dir 合並 而成, 這裏 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 的 庫檔案.

    連接器 在 標準搜索目錄 中 尋找 這個 庫檔案, 庫檔案 的 真正 名字 是 `lib library .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 不知道 某些 函數 永不返回 (含有 abort 和 longjmp ), 因此 有可能 出現 虛假 警告.

•   表達式語句 或 逗號表達式 的 左側 沒有 產生 作用 (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
    檢查 對 printf 和 scanf 等 函數 的 調用, 確認 各個 參數 類型 和 格式串 中的 一致.

-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, 2 或 3, 那麼 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) 增加, 編譯器 就 發出 警告. 例如, 某些 機器 上 只能 在 2 或 4 字節 邊界 上 訪問 整數, 如果 在 這種 機型 上 把 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
    視 警告 為 錯誤; 出現 任何 警告 即 放棄 編譯.

調試選項 (DEBUGGING OPTION)
GNU CC 擁有 許多 特別選項, 既可以 調試 使用者的 程式, 也可以 對 GCC 排錯:

-g  以 作業系統 的 本地格式 (stabs, COFF, XCOFF, 或 DWARF). 產生 調試信息. GDB 能夠 使用 這些 調試信息.

    在 大多數 使用 stabs 格式 的 系統 上, `-g ' 選項 啟動 只有 GDB 才使用 的 額外調試信息; 這些信息 使 GDB 調試 效果 更好, 但是 有可能 導致 其他 調試器 崩潰, 或 拒絕 讀入 程式. 如果 你 確定 要 控制 是否 生成 額外的 信息, 使用`-gstabs+ ', `-gstabs ', `-gxcoff+ ', `-gxcoff ', `-gdwarf+ ', 或 `-gdwarf ' (見下文).

    和 大多數 C 編譯器 不同, GNU CC 允許 結合使用 `-g ' 和 `-O ' 選項. 優化的 代碼 偶爾 製造 一些 驚異的 結果: 某些 聲明過的 變量 根本 不存在; 控制流程 直接 跑到 沒有 預料到的 地方; 某些語句 因為 計算結果 是 常量 或 已經確定 而 沒有 執行; 某些語句 在 其他 地方 執行, 因為 他們 被移到 循環 外面 了.

    然而 它 証明了 調試 優化的輸出 是 可能的. 對 可能 含有 錯誤 的 程式 使用 優化器 是 合理的.

如果 GNU CC 支持 輸出 多種 調試信息, 下面的 選項 則 非常有用.

-ggdb
    以 本地格式 (如果支持) 輸出 調試信息, 盡可能 包括 GDB 擴展.

-gstabs
    以 stabs 格式 (如果支持) 輸出 調試信息, 不包括 GDB 擴展. 這是 大多數 BSD 系統 上 DBX 使用 的 格式.

-gstabs+
    以 stabs 格式 (如果支持) 輸出 調試信息, 使用 只有 GNU 調試器 (GDB) 理解的 GNU 擴展. 使用 這些擴展 有可能 導致 其他 調試器 崩潰 或 拒絕 讀入 程式.

-gcoff
    以 COFF 格式 (如果支持) 輸出 調試信息. 這是 在 System V 第四版 以前 的 大多數 System V 系統 上 SDB 使用 的 格式.

-gxcoff
    以 XCOFF 格式 (如果支持) 輸出 調試信息. 這是 IBM RS/6000 系統 上 DBX 調試器 使用 的 格式.

-gxcoff+
    以 XCOFF 格式 (如果支持) 輸出 調試信息, 使用 只有 GNU 調試器 (GDB) 理解的 GNU 擴展. 使用 這些擴展 有可能 導致 其他 調試器 崩潰 或 拒絕 讀入 程式.

-gdwarf
    以 DWARF 格式 (如果支持) 輸出 調試信息. 這是 大多數 System V 第四版 系統 上 SDB 使用 的 格式.

-gdwarf+
    以 DWARF 格式 (如果支持) 輸出 調試信息, 使用 只有 GNU 調試器 (GDB) 理解的 GNU 擴展. 使用 這些擴展 有可能 導致 其他 調試器 崩潰 或 拒絕 讀入 程式.

-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel

-gdwarflevel
    請求 生成 調試信息, 同時 用 level 指出 需要 多少 信息. 預設的 level 值 是 2.

    Level 1 輸出 最少量 的 信息, 僅夠 在 不打算 調試 的 程式段 內 backtrace. 包括 函數 和 外部變量 的 描述, 但是 沒有 局部變量 和 行號 信息.

    Level 3 包含 更多的 信息, 如 程式中出現 的 所有 宏定義. 當 使用 `-g3 ' 選項 的 時候, 某些 調試器 支持 宏擴展.

-p  產生 額外代碼, 用於 輸出 profile 信息, 供 分析程式 prof 使用.

-pg 產生 額外代碼, 用於 輸出 profile 信息, 供 分析程式 gprof 使用.

-a  產生 額外代碼, 用於 輸出 基本塊 (basic block) 的 profile 信息, 它 記錄 各個 基本塊 的 執行 次數, 供 諸如 tcov 此類 的 程式 分析. 但是 注意, 這個 數據格式 並非 tcov 期待的. 最終 GNU gprof 將 處理 這些數據.

-ax 產生 額外代碼, 用於 從 'bb.in' 檔案 讀取 基本塊 的 profile 參數, 把 profile 的 結果 寫到 'bb.out' 檔案. `bb.in' 包含 一張 函數 列表. 一旦 進入 列表 中的 某個 函數, profile 操作 就 開始, 離開 最外層 的 函數 後, profile 操作 就 結束. 以 `-' 為 前綴名 的 函數 排除在 profile 操作 之外. 如果 函數名 不是 唯一的, 它 可以 寫成 `/path/filename.d:functionname' 來 澄清. `bb.out' 將 列出 一些 有效的 檔名. 這四個 函數名 具有 特殊含義: `__bb_jumps__' 導致 跳轉 (jump) 頻率 寫進 `bb.out'. `__bb_trace__' 導致 基本塊 序列 通過 管道 傳到 `gzip', 輸出 `bbtrace.gz' 檔案. `__bb_hidecall__' 導致 從 跟蹤 (trace) 中 排除 call 指令. `__bb_showret__' 導致 在 跟蹤 中 包括 返回指令.

-dletters
    編譯 的 時候, 在 letters 指定 的 時刻 做 調試轉儲 (dump). 用於 調試 編譯器. 大多數 轉儲 的 檔名 通過 源檔名 添加 字詞 獲得 (例如 `foo.c.rtl ' 或 `foo.c.jump ').

-dM 預處理 結束 的 時候 轉儲 所有的 宏定義, 不輸出到 檔案.

-dN 預處理 結束 的 時候 轉儲 所有的 宏名.

-dD 預處理 結束 的 時候 轉儲 所有的 宏定義, 同時 進行 正常 輸出.

-dy 語法分析 (parse) 的 時候 在 標準錯誤 轉儲 調試信息.

-dr RTL 階段 後 轉儲到 `file .rtl '.

-dx 僅對 函數 生成 RTL, 而不是 編譯. 通常 和 `r ' 聯用.

-dj 第一次 跳轉優化 後 轉儲到 `file .jump '.

-ds CSE (包括 有時候 跟在 CSE 後面的 跳轉優化) 後 轉儲到 `file .cse '.

-dL 循環優化 後 轉儲到 `file .loop '.

-dt 第二次 CSE 處理 (包括 有時候 跟在 CSE 後面的 跳轉優化) 後 轉儲到 `file .cse2 '.

-df 流程分析 (flow analysis) 後 轉儲到 `file .flow '.

-dc 指令組合 (instruction combination) 後 轉儲到 `file .combine '.

-dS 第一次 指令安排 (instruction schedule) 後 轉儲到 `file .sched '.

-dl 局部寄存器分配 後 轉儲到 `file .lreg '.

-dg 全局寄存器分配 後 轉儲到 `file .greg '.

-dR 第二次 指令安排 (instruction schedule) 後 轉儲到 `file .sched2 '.

-dJ 最後一次 跳轉優化 後 轉儲到 `file .jump2 '.

-dd 推遲分支調度 (delayed branch scheduling) 後 轉儲到 `file .dbr '.

-dk 寄存器-堆棧轉換 後 轉儲到 `file .stack '.

-da 產生 以上 所有的 轉儲.

-dm 運行結束後, 在 標準錯誤 顯示 記憶體使用統計.

-dp 在 匯編輸出 加注 指明 使用了 哪些 模式 (pattern) 及其 替代模式.

-fpretend-float
    交叉編譯 的 時候, 假定 目標機 和 宿主機 使用 同樣的 浮點格式. 它 導致 輸出 錯誤的 浮點常數, 但是 在 目標機 上 運行 的 時候, 真實的 指令序列 有可能 和 GNU CC 希望 的 一樣.

-save-temps
    保存 那些 通常 是 “臨時” 的 中間檔案; 置於 當前目錄 下, 並且 根據 源檔案 命名. 因此, 用 `-c -save-temps ' 選項 編譯 `foo.c ' 會 生成 `foo.cpp ' 和 `foo.s ' 以及 `foo.o ' 檔案.

-print-file-name=library
    顯示 庫檔案 library 的 全路徑名, 連接 時 會 使用 這個庫 — 其他 什麼事情 都不作. 根據 這個選項, GNU CC 既不編譯, 也不連接, 僅僅 顯示 檔名.

-print-libgcc-file-name
    和 `-print-file-name=libgcc.a ' 一樣.

-print-prog-name=program
    類似於 `-print-file-name ', 但是 查找 程式 program 如 `cpp '.

優化選項 (OPTIMIZATION OPTION)
這些選項 控制 多種 優化措施:

-O

-O1 優化. 對於 大函數, 優化編譯 佔用 稍微多 的 時間 和 相當大 的 記憶體.

    不使用 `-O ' 選項 時, 編譯器 的 目標 是 減少 編譯 的 開銷, 使 編譯結果 能夠 調試. 語句 是 獨立的: 如果 在 兩條語句 之間 用 斷點 中止 程式, 你 可以 對 任何 變量 重新 賦值, 或者 在 函數體 內 把 程式計數器 指到 其他語句, 以及 從 源程式 中 精確地 獲取 你 期待 的 結果.

    不使用 `-O ' 選項 時, 只有 聲明了 register 的 變量 才 分配使用 寄存器. 編譯結果 比 不用 `-O ' 選項 的 PCC 要 略遜一籌.

    使用了 `-O ' 選項, 編譯器 會試圖 減少 目標碼 的 大小 和 執行時間.

    如果 指定了 `-O ' 選項, `-fthread-jumps ' 和 `-fdefer-pop ' 選項 將被 打開. 在 有 delay slot 的 機器 上, `-fdelayed-branch ' 選項 將被 打開. 在 即使 沒有 幀指針 (frame pointer) 也支持 調試 的 機器 上, `-fomit-frame-pointer ' 選項 將被 打開. 某些機器 上 還可能會 打開 其他選項.

-O2 多優化一些. 除了 涉及 空間 和 速度 交換 的 優化選項, 執行 幾乎 所有的 優化工作. 例如 不進行 循環展開 (loop unrolling) 和 函數內嵌 (inlining). 和 -O 選項 比較, 這個選項 既增加了 編譯時間, 也提高了 生成代碼 的 運行效果.

-O3 優化的更多. 除了 打開 -O2 所做的 一切, 它 還 打開 了 -finline-functions 選項.

-O0 不優化.

    如果 指定了 多個 -O 選項, 不管 帶不帶 數字, 最後一個 選項 才是 生效 的 選項.

諸如 `-f flag ' 此類 的 選項 描述 一些 機器無關 的 開關. 大多數 開關 具有 肯定 和 否定 兩種格式; `-ffoo ' 開關選項 的 否定格式 應該是 `-fno-foo '. 下面的 列表 只展示了 一種 格式 — 那個 不是 預設選項 的 格式. 你 可以 通過 去掉 或 添加 `no- ' 構造出 另一種 格式.

-ffloat-store
    不要 在 寄存器 中 存放 浮點變量. 這樣 可以 防止 某些 機器 上 不希望 的 過高 精度, 如 68000 的 浮點寄存器 (來自 68881) 保存的 精度 超過了 double 應該 具有的 精度.

    對於 大多數 程式, 過高 精度 只有 好處. 但是 有些 程式 嚴格 依賴於 IEEE 浮點數 的 定義. 對 這樣的 程式 可以 使用 `-ffloat-store ' 選項.

-fmemoize-lookups

-fsave-memoized
    使用 探索法 (heuristic) 進行 更快的 編譯 (僅對 C++). 預設情況下 不使用 探索法. 由於 探索法 只對 某些 輸入檔案 有效, 其他程式 的 編譯速度 會變得 更慢.

    第一次 編譯器 必須 對 成員函數 (或對 成員數據 的 引用) 建立 一個 調用. 它 必須 (1) 判斷出 這個類 是否 實現了 那個 名字 的 成員函數; (2) 決定 調用 哪個 成員函數 (涉及到 推測 需要 做 哪種 類型轉換); (3) 檢查 成員函數 對 調用者 是否 可見. 所有 這些 構成 更慢的 編譯. 一般情形, 第二次 對 成員函數 (或對 成員數據 的 引用) 建立 的 調用, 必須 再次 經過 相同 長度 的 處理. 這 意味著 像 這樣的 代碼

    cout << "This " << p << " has " << n << " legs.\n";

    對 整個 三步驟 要做 六次 遍歷. 通過 使用 軟體緩存, “命中” 能夠 顯著地 減少 這種 代價. 然而 不幸的 是, 使用 這種 緩存 必須 實現 其他 機制, 帶來了 它 自己的 開銷. `-fmemoize-lookups ' 選項 打開 軟體緩存.

    因為 函數 的 正文環境 不同, 函數 對 成員 和 成員函數 的 訪問權 (可見性) 也可能 不同, g++ 可能 需要 刷新 緩存. 使用 `-fmemoize-lookups ' 選項, 每 編譯完 一個 函數 就 刷新 緩存. 而 `-fsave-memoized' 選項 也 啟用 同樣的 緩存, 但是 當 編譯器 發覺 最後 編譯 的 函數 的 正文環境 產生 的 訪問權 和 下一個 待編譯的 函數 相同, 編譯器 就 保留 緩存 內容. 這對 某個類 定義 許多 成員函數 時 非常 有用: 除了 某些 其他類 的 友函數, 每個 成員函數 擁有 和 其他 成員函數 完全一樣 的 訪問權, 因而 無需 刷新 緩存.

-fno-default-inline
    預設為 不要 把 成員函數 內嵌, 因為 它們 定義在 類的 作用域 內 (僅C++).

-fno-defer-pop
    一旦 函數 返回, 參數 就 立即 彈出. 對於 那些 調用 函數 後 必須 彈出 參數 的 機器, 編譯器 一般情況下 讓 幾次 函數調用 的 參數 堆積 在 棧 上, 然後 一次 全部 彈出.

-fforce-mem
    做 數學運算 前 把 將要 使用的 記憶體操作數 送入 寄存器. 通過 把 記憶體訪問 轉換成 潛在的 公共子表達式, 它 可能 產生 較好的 目標碼. 如果 它們 不是 公共子表達式, 指令組合 應該 消除 各自的 寄存器載荷. 我 樂意 傾聽 不同意見.

-fforce-addr
    做 數學運算 前 把 將要 使用的 記憶體地址常數 送入 寄存器. 它 可能 和 `-fforce-mem ' 一樣 產生 較好的 目標碼. 我 樂意 傾聽 不同意見.

-fomit-frame-pointer
    對於 不需要 幀指針 (frame pointer) 的 函數, 不要 在 寄存器 中 保存 幀指針. 這樣 能夠 避免 保存, 設置 和 恢復 幀指針 的 指令; 同時 對 許多 函數 提供 一個 額外的 寄存器. 但是 在 大多數 機器 上將 無法 調試 .

    某些機器上, 如 Vax, 這個 選項 無效, 因為 標準調用序列 自動 處理 幀指針, 通過 假裝 不存在 而 不保存 任何 東西. 機器描述宏 FRAME_POINTER_REQUIRED 控制 目標機 是否 支持 這個選項.

-finline-functions
    把 所有 簡單的 函數 集成進 調用者. 編譯器 探索式地 決定 哪些 函數 足夠 簡單, 值得 這種 集成.

    如果 集成了 所有 給定函數 的 調用, 而且 函數 聲明為 static , 那麼 一般說來 GCC 有權 不按 匯編代碼 輸出 函數.

-fcaller-saves
    允許 在 寄存器 裏 分配 數值, 但是 這個方案 通常 受到 各個 函數調用 的 沖擊, 因此 GCC 生成 額外的 代碼, 在 函數調用 的 前後 保存 和 復原 寄存器 內容. 僅當 生成代碼 看上去 優於 反之結果 時 才 實現 這樣 的 分配.

    某些 機器 上 該選項 預設為 允許, 通常 這些 機器 沒有 調用保護寄存器 代替 使用.

-fkeep-inline-functions
    即使 集成了 某個 函數 的 所有 調用, 而且 該函數 聲明為 static , 仍然 輸出 這個函數 一個 獨立的, 運行時 可調用 的 版本.

-fno-function-cse
    不要 把 函數地址 存入 寄存器; 讓 調用 固定函數 的 指令 顯式 給出 函數地址.

    這個選項 產生 效率 較低 的 目標碼, 但是 如果 不用 這個選項, 某些 不尋常 的 hack, 改變 匯編器 的 輸出, 可能 因 優化 而 帶來 困惑.

-fno-peephole
    禁止 任何 機器相關的 peephole 優化.

-ffast-math
    這個選項 出於 速度優化, 允許 GCC 違反 某些 ANSI 或 IEEE 規則/規格. 例如, 它 允許 編譯器 假設 sqrt 函數 的 參數 是 非負數.

    這個選項 不被 任何 `-O ' 選項 打開, 因為 對於 嚴格 依靠 IEEE 或 ANSI 規則/規格 實現 的 數學函數, 程式 可能 會產生 錯誤的 結果.

下列 選項 控制 特定的 優化. `-O2 ' 選項 打開 下面的 大多數 優化項, 除了 `-funroll-loops ' 和 `-funroll-all-loops ' 項.

而 `-O ' 選項 通常 打開 `-fthread-jumps ' 和 `-fdelayed-branch ' 優化項, 但是 特定的 機器 上的 預設優化項 有可能 改變.

如果 特別情況 下 非常 需要 “微調” 優化, 你 可以 使用 下面的 選項.

-fstrength-reduce
    執行 循環強度縮小 (loop strength reduction) 優化, 並且 消除 重復變量.

-fthread-jumps
    執行 優化 的 地點 是, 如果 某個 跳轉分支 的 目的地 存在 另一個 條件比較, 而且 該 條件比較 包含在 前一個 比較語句 之內, 那麼 執行 優化. 根據 條件 是 true 或者 false, 前面 那條 分支 重定向 到 第二條 分支 的 目的地 或者 緊跟在 第二條 分支 後面.

-funroll-loops
    執行 循環展開 (loop unrolling) 優化. 僅對 循環次數 能夠 在 編譯時 或 運行時 確定 的 循環 實行.

-funroll-all-loops
    執行 循環展開 (loop unrolling) 優化. 對 所有 循環 實行. 通常 使 程式 運行的 更慢.

-fcse-follow-jumps
    在 公共子表達式消元 (common subexpression elimination) 的 時候, 如果 沒有 其他 路徑 到達 某個 跳轉 的 目的地, 就 掃過 這條 jump 指令. 例如, 如果 CSE 遇到 帶有 else 從句 的 if 語句, 當 條件測試 為 false 時, CSE 就 跟在 jump 後面.

-fcse-skip-blocks
    它 類似於 `-fcse-follow-jumps ' 選項, 但是 CSE 跟在 條件跳轉 後面, 條件跳轉 跳過了 語句塊(block). 如果 CSE 遇到 一條 簡單的 if 語句, 不帶 else 從句, `-fcse-skip-blocks ' 選項 將導致 CSE 跟在 if 產生 的 跳轉 後面.

-frerun-cse-after-loop
    執行 循環優化 後, 重新 進行 公共子表達式消元.

-felide-constructors
    如果 看上去 合理 就 省略 構造子 (僅C++). 根據 這個選項, 對於 下面的 代碼, GNU C++ 直接 從 調用 foo 初始化 y , 而無需 通過 臨時變量:

    A foo (); A y = foo ();

    如果 沒有 這個選項, GNU C++ 首先 通過 調用 類型 A 合適的 構造子 初始化 y ; 然後 把 foo 的 結果 賦給 臨時變量; 最後, 用 臨時變量 替換 `y ' 的 初始值.

    ANSI C++ 標準草案 規定了 預設行為 (`-fno-elide-constructors '). 如果 程式的 構造子 存在 副效應, `-felide-constructors ' 選項 能夠 使 程式 有 不同的 表現, 因為 可能 忽略 一些 構造子 的 調用.

-fexpensive-optimizations
    執行 一些 相對 開銷 較大 的 次要 優化.

-fdelayed-branch
    如果 對 目標機 支持 這個 功能, 它 試圖 重新 排列 指令, 以便 利用 延遲分支 (delayed branch) 指令 後面的 指令 空隙.

-fschedule-insns
    如果 對 目標機 支持 這個 功能, 它 試圖 重新 排列 指令, 以便 消除 因 數據未緒 造成的 執行停頓. 這可以 幫助 浮點運算 或 記憶體訪問 較慢 的 機器 調取 指令, 允許 其他 指令 先執行, 直到 調取 指令 或 浮點運算 完成.

-fschedule-insns2
    類似於 `-fschedule-insns ' 選項, 但是 在 寄存器分配 完成後, 需要 一個 額外的 指令調度 過程. 對於 寄存器 數目 相對 較少, 而且 取記憶體指令 大於 一個周期 的 機器, 這個選項 特別 有用.

目標機選項 (TARGET OPTION)
預設情況下, GNU CC 編譯出 本機 類型 的 目標碼. 然而 也可以 把他 安裝成 交叉編譯器, 為 其他 機型 編譯 程式. 事實上, 針對 不同的 目標機, 可以 同時 安裝 GNU CC 相應 的 配置. 然後 用 `-b ' 選項 指定 目標機種.

順便提一下, 新版本 和 舊版本 的 GNU CC 可以 共存. 其中一個 版本 (可能是 最新的 那個) 為 預設 版本, 但是 有時候 你 希望 使用 其他 版本.

-b machine
    參數 machine 指出 編譯的 目標機種. 這個 選項 用於 安裝為 交叉編譯器 的 GNU CC.

    參數 machine 的 值 和 配置 GNU CC 交叉編譯器 時 設置 的 機器類型 一樣. 例如, 如果 交叉編譯器 配置有 `configure i386v', 意思是 編譯 80386 上的 System V 目標碼, 那麼 你 可以 通過 `-b i386v ' 運行 交叉編譯器.

    如果 沒有 指定 `-b ' 選項, 通常 指 編譯 本機 目標碼.

-V version
    參數 version 指出 運行 哪個 版本 的 GNU CC. 這個 選項 用於 安裝了 多個 版本 的 GCC. 例如, 如果 version 是 `2.0 ', 意味著 運行 GNU CC 2.0 版.

    如果 沒有 指定 `-V ' 選項, 預設版本 取決於 GNU CC 的 安裝方式, 一般說來 推薦 使用 通用版本.

機器相關選項 (MACHINE DEPENDENT OPTION)
每一種 目標機型 都有 自己的 特別選項, 這些 選項 用 `-m ' 開關 引導, 選擇 不同的 硬體 型號 或 配置 — 例如, 68010 還是 68020, 有沒有 浮點協處理器. 通過 指定 選項, 安裝 編譯器 的 一個 版本 能夠 為 所有的 型號 或 配置 進行 編譯.

此外, 編譯器 的 某些 配置 支持 附加的 特殊選項, 通常 是 為了 在 命令行 上 相容 這個 平台 的 其他 編譯器.

下面是 針對 68000 系列 定義 的 `-m ' 選項:

-m68000

-mc68000
    輸出 68000 的 目標碼. 如果 編譯器 按 基於 68000 的 系統 配置, 這個 選項 就是 預設選項.

-m68020

-mc68020
    輸出 68020 的 目標碼 (而不是 68000). 如果 編譯器 按 基於 68020 的 系統 配置, 這個 選項 就是 預設選項.

-m68881
    輸出 包含 68881 浮點指令 的 目標碼. 對於 大多數 基於 68020 的 系統 這是 預設選項, 除非 設置 編譯器 時 指定了 -nfp .

-m68030
    輸出 68030 的 目標碼. 如果 編譯器 按 基於 68030 的 系統 配置, 這個 選項 就是 預設選項.

-m68040
    輸出 68040 的 目標碼. 如果 編譯器 按 基於 68040 的 系統 配置, 這個 選項 就是 預設選項.

-m68020-40
    輸出 68040 的 目標碼, 但是 不使用 新指令. 生成 的 代碼 可以 在 68020/68881 上, 也可以 在 68030 或 68040 上 較有效地 運行.

-mfpa
    輸出 包含 SUN FPA 浮點指令 的 目標碼.

-msoft-float
    輸出 包含 浮點庫調用 的 目標碼. 警告: 所需的庫 不是 GNU CC 的 組成部分. 一般說來 GCC 使用 該機型 本地 C 編譯器 的 相應部件, 但是 作 交叉編譯 時 卻不能 直接 使用. 你 必須 自己 管理 提供 合適的 函數庫 用於 交叉編譯.

-mshort
    認為 int 類型 是 16 位寬, 相當於 short int .

-mnobitfield
    不使用 位域 (bit-field) 指令. `-m68000 ' 隱含指定了 `-mnobitfield '.

-mbitfield
    使用 位域指令. `-m68020 ' 隱含指定了 `-mbitfield '. 如果 你 使用 未改裝的 gcc, 這就是 預設選項.

-mrtd
    採用 另一種 函數調用約定, 函數 接受 固定 數目的 參數, 用 rtd 指令 返回, 該指令 返回時 彈出 棧內的 參數. 這個 方法 能夠 使 調用者 節省 一條 指令, 因為 他 這裏 不需要 彈出 參數.

    這種 調用約定 不相容 UNIX 的 正常 調用. 因此 如果 你 需要 調用 UNIX 編譯器 編譯的 庫函數, 你 就不能 使用 這個選項.

    此外, 所有 參數數量 可變地 函數 必須 提供 函數原型 (包括 printf ); 否則 編譯器 會生成 錯誤的 調用 代碼.

    另外, 如果 調用 函數 時 攜帶了 過多的 參數, 編譯器 將 生成 嚴重錯誤的 代碼. (正常情況下, 多餘的 參數 被 安全無害的 忽略.)

    68010 和 68020 處理器 支持 rtd 指令, 但是 68000 不支持.

下面是 針對 VAX 定義 的 `-m ' 選項:

-munix
    禁止 輸出 某些 跳轉指令 (aobleq 等等), VAX 的 UNIX 匯編器 無法 跨越 長范圍 (long ranges) 進行 處理.

-mgnu
    如果 使用 GNU 匯編器, 則 輸出 那些 跳轉指令,

-mg 輸出 g-format 浮點數, 取代 d-format.

下面是 SPARC 支持的 `-m ' 選項開關:

-mfpu

-mhard-float
    輸出 包含 浮點指令 的 目標碼. 這是 預設選項.

-mno-fpu

-msoft-float
    輸出 包含 浮點庫調用 的 目標碼. 警告: 沒有 為 SPARC 提供 GNU 浮點庫. 一般說來 使用 該機型 本地 C 編譯器 的 相應部件, 但是 不能 直接 用於 交叉編譯. 你 必須 自己 安排, 提供 用於 交叉編譯 的 庫函數.

    -msoft-float 改變了 輸出檔案 中的 調用約定; 因此 只有 用 這個 選項 編譯 整個 程式 才有 意義.

-mno-epilogue

-mepilogue
    使用 -mepilogue (預設) 選項 時, 編譯器 總是 把 函數 的 退出 代碼 放在 函數 的 尾部. 任何 在 函數 中間 的 退出 語句 (例如 C 中的 return 語句) 將 產生出 跳轉指令 指向 函數 尾部.

    使用 -mno-epilogue 選項 時, 編譯器 盡量 在 每個 函數 退出點 嵌入 退出 代碼.

-mno-v8

-mv8

-msparclite
    這三個 選項 選擇 不同種類 的 SPARC 系統.

    預設情況下 (除非 特別為 Fujitsu SPARClite 配置), GCC 生成 SPARC v7 目標碼.

    -mv8 生成 SPARC v8 目標碼. 他 和 v7 目標碼 唯一的 區別 是, 編譯器 生成 整數乘法 和 整數除法 指令, SPARC v8 支持 該指令, 而 v7 體系 不支持.

    -msparclite 生成 SPARClite 目標碼. 增加了 SPARClite 支持的 整數乘法, 整數除法單步掃描 (integer divide step and scan (ffs)) 指令. v7 體系 不支持 這些 指令.

-mcypress

-msupersparc
    這兩個 選項 選擇 處理器 型號, 針對 處理器 進行 代碼 優化.

    -mcypress 選項 (預設項) 使 編譯器 對 Cypress CY7C602 芯片 優化 代碼, SparcStation/SparcServer 3xx 系列 使用 這種 芯片. 該選項 也 適用於 老式的 SparcStation 1, 2, IPX 等 機型..

    -msupersparc 選項 使 編譯器 對 SuperSparc 處理器 優化 代碼, SparcStation 10, 1000 和 2000 系列 使用 這種 芯片. 同時 該選項 啟用 完整的 SPARC v8 指令集.

下面是 針對 Convex 定義 的 `-m ' 選項:

-mc1
    輸出 C1 的 目標碼. 當 編譯器 對 C1 配置時, 這是 預設選項.

-mc2
    輸出 C2 的 目標碼. 當 編譯器 對 C2 配置時, 這是 預設選項.

-margcount
    在 每個 參數列表 的 前面 放置 一個 參數計數字 (argument count word). 某些 不可移植 的 Convex 和 Vax 程式 需要 這個 參數計數字. (調試器 不需要 他, 除非 函數 帶有 變長參數 列表; 這個 信息 存放在 符號表 中.)

-mnoargcount
    忽略 參數計數字. 如果 你 使用 未改裝 的 gcc, 這是 預設 選項.

下面是 針對 AMD Am29000 定義 的 `-m ' 選項:

-mdw
    生成的 目標碼 認為 DW 置位, 就是說, 字節 和 半字 操作 由 硬體 直接 支持. 該選項 是 預設選項.

-mnodw
    生成的 目標碼 認為 DW 沒有 置位.

-mbw
    生成的 目標碼 認為 系統 支持 字節 和 半字 寫操作. 該選項 是 預設選項.

-mnbw
    生成的 目標碼 認為 系統 不支持 字節 和 半字 寫操作. 該選項 隱含 開啟 了 `-mnodw ' 選項.

-msmall
    使用 小記憶體模式, 小記憶體模式 假設 所有 函數 的 地址 位於 某個 256 KB 段內, 或者 所有 函數 的 絕對地址 小於 256K. 這樣 就可以 用 call 指令 代替 const , consth , calli 指令 序列.

-mlarge
    假設 不能 使用 call 指令; 這是 預設選項.

-m29050
    輸出 Am29050 的 目標碼.

-m29000
    輸出 Am29000 的 目標碼. 這是 預設選項.

-mkernel-registers
    生成的 目標碼 引用 gr64-gr95 寄存器 而不是 gr96-gr127 寄存器. 該選項 可以 用於 編譯 核心代碼, 核心 需要 一組 全局寄存器, 這些 全局寄存器 和 使用者模式 使用的 寄存器 完全無關.

    注意, 使用 這個 選項 時, `-f ' 選項 中的 寄存器名字 必須是 normal, user-mode, names.

-muser-registers
    使用 普通 全局寄存器集 gr96-gr127 . 這是 預設選項.

-mstack-check
    在 每次 堆棧 調整 後 插入 一條 __msp_check 調用. 這個選項 常用於 核心代碼.

下面是 針對 Motorola 88K 體系 定義 的 `-m ' 選項:

-m88000
    生成的 目標碼 可以 在 m88100 和 m88110 上 正常工作.

-m88100
    生成的 目標碼 在 m88100 上 工作的 最好, 但也可以 在 m88110 上 運行.

-m88110
    生成的 目標碼 在 m88110 上 工作的 最好, 可能 不能 在 m88100 上 運行.

-midentify-revision
    在 匯編器 的 輸出端 包含 一條 ident 指令, 記錄 源檔名, 編譯器名字 和 版本, 時標, 以及 使用的 編譯選項,

-mno-underscores
    在 匯編器 的 輸出端, 符號名字 前面 不添加 下劃線. 預設情況 是 在 每個 名字 前面 增加 下劃線 前綴.

-mno-check-zero-division

-mcheck-zero-division
    早期 型號 的 88K 系統 在 除零操作 上 存在 問題, 特定情況下 許多 機器 無法 自陷. 使用 這些 選項 可以 避免包含 (或 可以 顯明包含) 附加的 代碼, 這些代碼 能夠 檢查 除零錯, 發送 例外信號. GCC 所有 88K 的 配置 預設 使用 `-mcheck-zero-division ' 選項.

-mocs-debug-info

-mno-ocs-debug-info
    包含 (或忽略) 附加的 調試信息 (關於 每個 棧架結構 中 寄存器 的 使用), 88Open Object Compatibility Standard, “OCS”, 對 此信息 做了 說明. GDB 不需要 這些 額外信息. DG/UX, SVr4, 和 Delta 88 SVr3.2 的 預設配置 是 包含 調試信息, 其他 88k 機型 的 預設配置 是 忽略 這個信息.

-mocs-frame-position

-mno-ocs-frame-position
    強制 (或 不要求) 把 寄存器值 存儲到 棧架結構 中的 指定位置 (按 OCS 的說明). DG/UX, Delta88 SVr3.2 和 BCS 的 預設配置 使用 `-mocs-frame-position ' 選項; 其他 88k 機型 的 預設配置 是 `-mno-ocs-frame-position '.

-moptimize-arg-area

-mno-optimize-arg-area
    控制 如何 在 堆棧結構 中 存儲 函數參數. `-moptimize-arg-area ' 節省 空間, 但是 有可能 宕掉 某些 調試器 (不是 GDB). `-mno-optimize-arg-area ' 証實 比 標準選項 好. 預設情況下 GCC 不優化 參數域.

-mshort-data-
    num 通過 和 r0 關聯, 產生 較小的 數據引用 (data reference), 這樣 就可以 用 單指令 調入 一個 數值 (而不是 平常的 雙指令). 使用者 通過 選項中的 num 控制 改變 哪種 數據引用. 例如, 如果 你 指定了 `-mshort-data-512 ', 那麼 受影響的 數據引用 是 小於 512 字節 的 數據移動. -mshort-data- num 選項 對 大於 64K 的 num 無效.

-mserialize-volatile

-mno-serialize-volatile
    產生, 或 不產生 代碼 來保証 對 易變記憶體訪問 的 結果一致.

    對於 常用的 處理器 子型號, GNU CC 始終 預設 保証 這種 一致性. 如何實現 結果一致 取決於 處理器 子型號.

    m88100 處理器 不對 記憶體引用 重新安排, 因此 訪問結果 始終一致. 如果 使用了 `-m88100 ' 選項, GNU CC 不產生 任何 針對 結果一致 的 特別指令.

    m88110 處理器 的 記憶體引用順序 並不始終 符合 指令 請求的 引用順序. 特別是 某條 讀取指令 可能 在 先前的 存儲指令 之前 執行. 多處理器 環境下, 亂序訪問 擾亂了 易變記憶體訪問 的 結果一致. 因此 當使用 `-m88000 ' 或 `-m88110 ' 選項時, GNU CC 在 適當的時候 產生 特別的指令 迫使 執行順序 正確.

    這些 用於 保証 一致性 的 額外代碼 有可能 影響 程式 的 性能. 如果 你 確認 能夠 安全地 放棄 這種 保証, 你 可以 使用 `-mno-serialize-volatile ' 選項.

    如果 你 使用 `-m88100 ' 選項, 但是 需要 在 m88110 處理器 上 運行時 的 結果一致, 你 應該 加上 `-mserialize-volatile ' 選項.

-msvr4

-msvr3
    打開 (`-msvr4 ') 或 關閉 (`-msvr3 ') 和 System V 第四版 (SVr4) 相關的 編譯器擴展. 效果 如下:

•   輸出 哪種 匯編語法 (你 可以 使用 `-mversion-03.00 ' 選項 單獨 選擇).

•   `-msvr4 ' 使 C 預處理器 識別 `#pragma weak ' 指令

•   `-msvr4 ' 使 GCC 輸出 額外的 聲明指令(declaration directive), 用於 SVr4.

除了 SVr4 配置, `-msvr3 ' 是 所有 m88K 配置 的 預設選項.

-mtrap-large-shift

-mhandle-large-shift
    包含 一些 指令, 用於 檢測 大於 31 位 的 位移 (bit-shift); 根據 相應的 選項, 對 這樣 的 位移 發出 自陷 (trap) 或 執行 適當 的 處理代碼. 預設情況下, GCC 對 大位移 不做 特別處理.

-muse-div-instruction
    很早以前 的 88K 型號 沒有 (div) 除法指令, 因此 預設情況下 GCC 避免 產生 這條 指令. 而 這個 選項 告訴 GCC 該指令 是 安全的.

-mversion-03.00
    在 DG/UX 配置 中 存在 兩種 風格 的 SVr4. 這個選項 修改 -msvr4 , 選擇 hybrid-COFF 或 real-ELF 風格. 其他 配置 均 忽略 該選項.

-mwarn-passed-structs
    如果 某個函數 把 結構 當做 參數 或 結果 傳遞, GCC 發出 警告. 隨著 C 語言 的 發展, 人們 已經 改變了 傳遞 結構 的 約定, 它 往往 導致 移植問題. 預設情況下, GCC 不會 發出 警告.

下面的選項 用於 IBM RS6000:

-mfp-in-toc

-mno-fp-in-toc
    控制 是否 把 浮點常量 放到 內容表 (TOC) 中, 內容表 存放 所有的 全局變量 和 函數地址. 預設情況下, GCC 把 浮點常量 放到 這裏; 如果 TOC 溢出, `-mno-fp-in-toc ' 選項 能夠 減少 TOC 的 大小, 這樣 就可以 避免 溢出.

下面的 `-m ' 選項 用於 IBM RT PC:

-min-line-mul
    對於 整數乘法 使用 嵌入代碼. 這是 預設選項.

-mcall-lib-mul
    對於 整數乘法 使用 lmul$$ .

-mfull-fp-blocks
    生成 全尺寸 浮點數據塊, 包括 IBM 建議 的 最少數量 的 活動空間 (scratch space). 這是 預設選項.

-mminimum-fp-blocks
    不要 在 浮點數據塊 中 包括 額外的 活動空間. 這樣 就 產生 較小 但是 略慢 的 可執行程式, 因為 活動空間 必須 動態分配.

-mfp-arg-in-fpregs
    採用 不相容 IBM 調用約定 的 調用序列, 通過 浮點寄存器 傳送 浮點參數. 注意, 如果 指定了 這個選項, varargs.h 和 stdargs.h 將 無法 支持 浮點單元.

-mfp-arg-in-gregs
    使用 正常的 調用約定 處理 浮點參數. 這是 預設選項.

-mhc-struct-return
    通過 記憶體 返回 大於 一個字 的 結構, 而不是 通過 寄存器. 用於 相容 MetaWare HighC (hc) 編譯器. 使用 `-fpcc-struct-return ' 選項 可以 相容 Portable C 編譯器 (pcc).

-mnohc-struct-return
    如果可以, 通過 寄存器 返回 某些 大於 一個字 的 結構. 這是 預設選項. 如果 打算 相容 IBM 提供 的 編譯器, 請使用 `-fpcc-struct-return ' 或 `-mhc-struct-return ' 選項.

下面的 `-m ' 選項 用於 MIPS 家族 的 電腦:

-mcpu=cpu-type
    生成 指令 的 時候, 假設 預設的 機器類型 是 cpu-type . 預設情況下 的 cpu-type 是 default, GCC 將選取 任何機型 上 都是 最長周期時間 的 指令, 這樣 才能使 代碼 在 所有的 MIPS 處理器 上 以 合理 的 速度 運行. cpu-type 的 其他 選擇 是 r2000, r3000, r4000, 和 r6000. 雖然 選定 某個 cpu-type 後, GCC 將 針對 選定的 芯片 安排 對應的 工作, 但是 如果 不指定 -mips2 或 -mips3 選項, 編譯器 不會 輸出 任何 不符合 MIPS ISA (instruction set architecture) 一級 的 代碼.

-mips2
    輸出 MIPS ISA 二級指令 (可能的擴展, 如平方根指令). -mcpu=r4000 或 -mcpu=r6000 選項 必須 和 -mips2 聯用.

-mips3
    輸出 MIPS ISA 三級指令 (64位指令). -mcpu=r4000 選項 必須 和 -mips2 聯用. (譯注: 疑為 -mips3)

-mint64

-mlong64

-mlonglong128
    這些 選項 目前 不起作用.

-mmips-as
    產生 用於 MIPS 匯編器 的 代碼, 同時 使用 mips-tfile 添加 普通的 調試信息. 對於 大多數 平台 這是 預設選項, 除了 OSF/1 參考平台, 它 使用 OSF/rose 目標 格式. 如果 打開了 任一個 -ggdb, -gstabs, 或 -gstabs+ 選項開關, mips-tfile 程式 就把 stab 封裝在 MIPS ECOFF 裏面.

-mgas
    產生 用於 GNU 匯編器 的 代碼. 在 OSF/1 參考平台 上 這是 預設選項, 它 使用 OSF/rose 目標 格式.

-mrnames

-mno-rnames
    -mrnames 開關選項 告訴 輸出代碼 使用 MIPS 軟體名稱 說明 寄存器, 而不是 硬體名稱 (就是說, 用 a0 代替 $4). GNU 匯編器 不支持 -mrnames 選項, 而 MIPS 匯編器 則 運行 MIPS C 預處理器 處理 源檔案. -mno-rnames 是 預設選項.

-mgpopt

-mno-gpopt
    -mgpopt 開關選項 要求 在 正文段 中 把 所有的 數據聲明 寫到 指令 前面, 使 各種 MIPS 匯編器 對 短類型 全局 或 靜態 數據項 (short global or static data items) 輸出 單字記憶體訪問 而不是 雙字記憶體訪問. 當 打開 編譯優化 時, 這是 預設功能.

-mstats

-mno-stats
    每次 處理完 非嵌入函數 (non-inline function) 後, -mstats 開關選項 使 編譯器 向 標準錯誤檔案 輸出 一行 關於 程式 的 統計資料 (保存的 寄存器 數目, 堆棧 大小, 等等).

-mmemcpy

-mno-memcpy
    -mmemcpy 開關選項 使 所有 的 塊移動 操作 調用 適當的 string 函數 (memcpy 或 bcopy), 而不是 生成 嵌入代碼.

-mmips-tfile

-mno-mips-tfile
    當 MIPS 匯編器 生成 mips-tfile 檔案 (用於 幫助 調試) 後, -mno-mips-tfile 開關選項 阻止 編譯器 使用 mips-tfile 後期處理 (postprocess) 目標檔案. 不運行 mips-tfile 就 沒有 調試器 關注的 局部變量. 另外, stage2 和 stage3 目標檔案 將把 臨時檔名 傳遞給 匯編器, 嵌在 目標檔案 中, 這 意味著 不比較 目標檔案 是否 相同.

-msoft-float
    輸出 包含 浮點庫調用. 警告: 所需庫 不是 GNU CC 的 一部分. 一般說來 使用 該機型 本地 C 編譯器 的 相應部件, 但是 不能 直接 用於 交叉編譯, 你 必須 自己 安排, 提供 交叉編譯 適用的 庫函數.

-mhard-float
    輸出 包含 浮點指令. 如果 編譯器 沒有 被改動, 這就是 預設選項.

-mfp64
    編譯器 認為 狀態字 的 FR 置位(on), 也就是說 存在 32 64-bit 浮點寄存器, 而不是 32 32-bit 浮點寄存器. 同時 必須 打開 -mcpu=r4000 和 -mips3 開關.

-mfp32
    認為 存在 32 32-bit 浮點寄存器. 這是 預設選項.

-mabicalls

-mno-abicalls
    輸出 (或 不輸出) .abicalls, .cpload, 和 .cprestore 偽指令, 某些 System V.4 版本 用於 位置無關代碼.

-mhalf-pic

-mno-half-pic
    -mhalf-pic 開關選項 要求 把 外部引用 的 指針 放到 數據段, 並且 載入 記憶體, 而不放到 正文段. 該選項 目前 不起作用.

-G num
    把 小於等於 num 字節 的 全局 或 靜態 數據 放到 小的 數據段 或 bss 段, 而不是 普通的 數據段 或 bss 段. 這樣 匯編器 可以 輸出 基於 全局指針 (gp 或 $28), 的 單字記憶體訪問指令 而非 普通的 雙字指令. 預設情況下, 用 MIPS 匯編器 時 num 是 8, 而 GNU 匯編器 則為 0. 另外, -Gnum 選項 也被 傳遞 給 匯編器 和 連接器. 所有 的 模塊 必須在 相同的 -Gnum 值下 編譯.

-nocpp
    匯編 使用者匯編檔案 (帶有 `.s ' 延伸檔名) 時, 告訴 MIPS 匯編器 不要 運行 預處理器.

下面的 `-m ' 選項 用於 Intel 80386 族 電腦: -m486

-mno-486
    控制 是否 生成 對 486 優化 的 代碼.

-msoft-float
    輸出 包含 浮點庫調用. 警告: 所需庫 不是 GNU CC 的 一部分. 一般說來 使用 該機型 本地 C 編譯器 的 相應部件, 但是 不能 直接 用於 交叉編譯, 你 必須 自己 安排, 提供 交叉編譯 適用的 庫函數.

    在 函數 把 浮點返回值 放在 80387 寄存器棧 的 機器 上, 即使 設置了 `-msoft-float ' 選項, 也可能會 發出 一些 浮點操作碼.

-mno-fp-ret-in-387
    不用 FPU 寄存器 返回 函數值.

    通常 函數調用約定 把 float 和 double 的 返回值 放在 FPU 寄存器 中, 即使 不存在 FPU. 這種作法 的 理念 是 作業系統 應該 仿真出 FPU.

    而 `-mno-fp-ret-in-387 ' 選項 使 浮點值 通過 普通的 CPU 寄存器 返回.

下面的 `-m ' 選項 用於 HPPA 族 電腦:

-mpa-risc-1-0
    生成 PA 1.0 處理器 的 目標碼.

-mpa-risc-1-1
    生成 PA 1.1 處理器 的 目標碼.

-mkernel
    生成 適用於 核心 的 目標碼. 特別要 避免 add 指令, 它 有 一個 參數 是 DP 寄存器; 用 addil 代替 add 指令. 這樣 可以 避免 HP-UX 連接器 的 某個 嚴重 bug.

-mshared-libs
    生成 能夠 連接 HP-UX 共享庫 的 目標碼. 該選項 還沒有 實現 全部功能, 對 PA 目標 預設為 關閉. 使用 這個選項 會 導致 編譯器 生成 錯誤的 目標碼.

-mno-shared-libs
    不生成 連接 HP-UX 共享庫 的 目標碼. 這是 PA 目標 的 預設選項.

-mlong-calls
    生成的 目標碼 允許 同一個 源檔案 中的 函數調用, 調用點 和 被調函數 的 距離 可以 超過 256K 之遠. 不需要 打開 這個 開關選項, 除非 連接器 給出 “branch out of range errors“ 這樣的 錯誤.

-mdisable-fpregs
    防止 任何情況下 使用 浮點寄存器. 編譯 核心 需要 這個選項, 核心 切換 浮點寄存器 的 執行環境 速度 非常緩慢. 如果 打開了 這個 開關選項 同時 試圖 浮點操作, 編譯 將 失敗.

-mdisable-indexing
    防止 編譯器 使用 索引地址模式 (indexing address mode). 這樣 在 MACH 上 編譯 MIG 生成的 代碼 時, 可以 避免 一些 非常 晦澀的 問題.

-mtrailing-colon
    在 標記定義 (label definition) 的 末尾 添加 一個 冒號 (用於 ELF 匯編器).

下面的 `-m ' 選項 用於 Intel 80960 族 電腦:

-mcpu-type
    預設 機器 類型 為 cpu-type , 使 編譯器 產生 對應的 指令, 地址模式 和 記憶體對齊. 預設的 cpu-type 是 kb; 其他 選擇 有 ka, mc, ca, cf, sa, 和 sb.

-mnumerics

-msoft-float
    -mnumerics 開關選項 指出 處理器 不支持 浮點指令. -msoft-float 開關選項 指出 不應該 認為 機器 支持 浮點操作.

-mleaf-procedures

-mno-leaf-procedures
    企圖 (或防止) 改變 葉過程 (leaf procedure), 使其 可被 bal 指令 以及 call 指令 調用. 對於 直接函數調用, 如果 bal 指令 能夠 被 匯編器 或 連接器 替換, 這 可以 產生 更有效 的 代碼, 但是 其他 情況下 產生 較低效 的 代碼, 例如 通過 函數指針 調用 函數, 或 使用了 不支持 這種 優化 的 連接器.

-mtail-call

-mno-tail-call
    執行 (或不執行) 更多的 嘗試 (除過 編譯器 那些 機器無關 部分), 優化 進入 分支 的 尾遞歸 (tail-recursive) 調用. 你 可能 不需要 這個, 因為 檢測 什麼 地方 無效 沒有 全部 完成. 預設 開關 是 -mno-tail-call.

-mcomplex-addr

-mno-complex-addr
    認為 (或 不認為) 在 當前的 i960 設備 上, 值得 使用 復合地址模式 (complex addressing mode). 復合地址模式 可能 不值得 用到 K 系列, 但是 一定 值得 用在 C 系列. 目前 除了 CB 和 CC 處理器, 其他 處理器 上 -mcomplex-addr 是 預設選項.

-mcode-align

-mno-code-align
    把 目標碼 對齊到 8 字節 邊界 上 (或者 不必), 這樣 讀取 會 快一些. 目前 只對 C 系列 預設 打開.

-mic-compat

-mic2.0-compat

-mic3.0-compat
    相容 iC960 v2.0 或 v3.0.

-masm-compat

-mintel-asm
    相容 iC960 匯編器.

-mstrict-align

-mno-strict-align
    不允許 (或允許) 邊界不對齊 的 訪問.

-mold-align
    使 結構對齊 (structure-alignment) 相容 Intel 的 gcc 發行版本 1.3 (基於 gcc 1.37). 目前 這個選項 有點問題, 因為 #pragma align 1 總是 作 同樣的 設定, 而且 無法 關掉.

下面的 `-m ' 選項 用於 DEC Alpha 設備:

-mno-soft-float

-msoft-float
    使用 (或 不使用) 硬體浮點指令 進行 浮點運算. 打開 -msoft-float 時, 將 使用 `libgcc1.c ' 中的 函數 執行 浮點運算. 除非 它們 被 仿真 浮點操作 的 例程 替換, 或者 類似, 它們 被 編譯為 調用 仿真例程, 這些 例程 將發出 浮點操作. 如果 你 為 不帶 浮點操作 的 Alpha 編譯 程式, 你 必須 確保 建立了 這個 庫, 以便 不調用 仿真例程.

    注意, 不帶 浮點操作 的 Alpha 也要求 擁有 浮點寄存器.

-mfp-reg

-mno-fp-regs
    生成 使用 (或 不使用) 浮點寄存器群 的 目標代碼. -mno-fp-regs 包含有 -msoft-float 開關選項. 如果 不使用 浮點寄存器, 浮點操作數 就像 整數 一樣 通過 整數寄存器 傳送, 浮點運算結果 放到 $0 而不是 $f0. 這是 非標準 調用, 因此 任何 帶有 浮點 參數或返回值 的 函數, 如果 被 -mno-fp-regs 開關 編譯過的 目標碼 調用, 它 也必須 用這個 選項 編譯.

    這個選項 的 典型用法 是 建立 核心, 核心 不使用 任何 浮點寄存器, 因此 沒必要 保存 和 恢復 這些 寄存器.

下面 附加的 選項 出現在 System V 第四版 中, 用於 相容 這些 系統 中的 其他 編譯器:

-G  在 SVr4 系統 中, gcc 出於 相容 接受了 `-G ' 選項 (然後 傳遞給 連接器). 可是 我們 建議 使用 `-symbolic ' 或 `-shared '選項, 而不在 gcc 命令行 上 出現 連接選項.

-Qy 驗証 編譯器 用的 工具 的 版本, 輸出到 .ident 匯編指令.

-Qn 制止 輸出端 的 .ident 指令 (預設選項).

-YP,dirs
    對於 `-l ' 指定的 庫檔案, 只搜索 dirs . 你 可以 在 dirs 中 用 冒號 隔開 各個 目錄項.

-Ym,dir
    在 dir 目錄 中 尋找 M4 預處理器. 匯編器 使用 這個 選項.

代碼生成選項 (CODE GENERATION OPTION)
下面的 選項 和 平台 無關, 用於 控制 目標碼生成 的 接口約定.

大部分 選項 以 `-f' 開始. 這些選項 擁有 確定 和 否定 兩種 格式; `-ffoo ' 的 否定格式 是 `-fno-foo '. 後面的 描述 將 只列舉 其中 的 一個 格式 — 非預設 的 格式. 你 可以 通過 添加或去掉 `no- ' 推測出 另一個 格式.

-fnonnull-objects
    假設 通過 引用 (reference) 取得的 對象 不為 null (僅 C++).

    一般說來, GNU C++ 對 通過 引用 取得的 對象 作 保守 假設. 例如, 編譯器 一定會 檢查 下似 代碼 中的 a 不為 null:

    obj &a = g (); a.f (2);

    檢查 類似 的 引用 需要 額外的 代碼, 然而 對於 很多 程式 是 不必要的. 如果 你的 程式 不要求 這種檢查, 你 可以 用 `-fnonnull-objects ' 選項 忽略它.

-fpcc-struct-return
    函數 返回 struct 和 union 值時, 採用 和 本地編譯器 相同的 參數約定. 對於 較小的結構, 這種約定 的 效率 偏低, 而且 很多 機器 上 不能 重入; 它的 優點 是 允許 GCC 編譯 的 目標碼 和 PCC 編譯 的 目標碼 互相調用.

-freg-struct-return
    一有可能 就 通過 寄存器 返回 struct 和 union 函數值. 對於 較小的結構, 它 比 -fpcc-struct-return 更有效率.

    如果 既沒有 指定 -fpcc-struct-return , 也沒有 指定 -freg-struct-return, GNU CC 預設使用 目標機 的 標準約定. 如果 沒有 標準約定, GNU CC 預設採用 -fpcc-struct-return.

-fshort-enums
    給 enum 類型 只分配 它 聲明的 值域范圍 的 字節數. 就是說, enum 類型 等於 大小足夠 的 最小整數類型.

-fshort-double
    使 double 類型 的 大小 和 float 一樣.

-fshared-data
    要求 編譯結果 的 數據 和 非 const 變量 是 共享數據, 而不是 私有數據. 這種差別 僅在 某些 作業系統 上面 有意義, 那裏的 共享數據 在 同一個 程式 的 若幹 進程 間 共享, 而 私有數據 在 每個 進程 內 都有 副件.

-fno-common
    即使 未初始化 的 全局變量 也 分配在 目標檔案 的 bss 段, 而不是 把 它們 當做 普通塊 (common block) 建立. 這樣的 結果 是, 如果 在 兩個 不同 的 編譯結果 中 聲明了 同一個 變量 (沒使用 extern ), 連接 它們 時 會 產生 錯誤. 這個選項 可能 有用 的 唯一情況 是, 你 希望 確認 程式 能 在 其他系統 上 運行, 而 其他系統 總是 這麼 做.

-fno-ident
    忽略 `#ident ' 指令.

-fno-gnu-linker
    不要 把 全局初始化部件 (如 C++ 的 構造子 和 解構子) 輸出為 GNU 連接器 使用 的 格式 (在 GNU 連接器 是 標準方法 的 系統 上). 當你 打算 使用 非 GNU 連接器 的 時候 可以用 這個選項, 非GNU連接器 也需要 collect2 程式 確保 系統連接器 放入 構造子 (constructor) 和 解構子 (destructor). (GNU CC 的 發佈包 中 包含有 collect2 程式.) 對於 必須 使用 collect2 的 系統, 編譯器驅動程式 gcc 自動 配置為 這麼做.

-finhibit-size-directive
    不要 輸出 .size 匯編指令, 或其他 類似指令, 當 某個函數 一分為二, 兩部分 在 記憶體 中 距離 很遠 時 會 引起 問題. 當 編譯 `crtstuff.c ' 時 需要 這個選項; 其他情況下 都不應該 使用.

-fverbose-asm
    輸出 匯編代碼 時 放些 額外的 注釋信息. 這個選項 僅用於 確實 需要 閱讀 匯編輸出 的 時候 (可能 調試 編譯器 自己 的 時候).

-fvolatile
    使 編譯器 認為 所有 通過 指針 訪問 的 記憶體 是 易變記憶體 (volatile).

-fvolatile-global
    使 編譯器 認為 所有的 外部和全局變量 是 易變記憶體.

-fpic
    如果 支持 這種 目標機, 編譯器 就生成 位置無關目標碼. 適用於 共享庫 (shared library).

-fPIC
    如果 支持 這種 目標機, 編譯器 就輸出 位置無關目標碼. 適用於 動態連接 (dynamic linking), 即使 分支 需要 大范圍 轉移.

-ffixed-reg
    把 名為 reg 的 寄存器 按 固定寄存器 看待 (fixed register); 生成的 目標碼 不應該 引用 它 (除了 或許 用作 棧指針, 幀指針, 或其他 固定的角色).

    reg 必須是 寄存器 的 名字. 寄存器 名字 取決於 機器, 用 機器描述宏檔案 的 REGISTER_NAMES 宏 定義.

    這個選項 沒有 否定格式, 因為 它 列出 三路選擇.

-fcall-used-reg
    把 名為 reg 的 寄存器 按 可分配寄存器 看待, 不能 在 函數調用 間 使用. 可以 臨時使用 或 當做 變量 使用, 生存期 不超過 一個 函數. 這樣編譯的 函數 無需 保存 和 恢復 reg 寄存器.

    如果 在 可執行模塊 中, 把 這個選項 說明的 寄存器 用作 固定角色 將會 產生 災難性結果, 如 棧指針 或 幀指針.

    這個選項 沒有 否定格式, 因為 它 列出 三路選擇.

-fcall-saved-reg
    把 名為 reg 的 寄存器 按 函數 保護 的 可分配寄存器 看待. 可以 臨時使用 或 當做 變量 使用, 它 甚至能 在 函數 間 生存. 這樣編譯的 函數 會 保存 和 恢復 使用中 的 reg 寄存器.

    如果 在 可執行模塊 中, 把 這個選項 說明的 寄存器 用作 固定角色 將會 產生 災難性結果, 如 棧指針 或 幀指針.

    另一種 災難 是 用 這個選項 說明的 寄存器 返回 函數值.

    這個選項 沒有 否定格式, 因為 它 列出 三路選擇.

PRAGMAS
GNU C++ 支持 兩條 `#pragma ' 指令 使 同一個 頭檔案 有 兩個用途: 對象類 的 接口定義, 對象類 完整的 內容定義.

#pragma interface
    (僅對 C++) 在 定義 對象類 的 頭檔案 中, 使用 這個指令 可以 節省 大部分 採用 該類 的 目標檔案 的 大小. 一般說來, 某些信息 (內嵌成員函數 的 備份副件, 調試信息, 實現 虛函數 的 內部表格等) 的 本地副件 必須 保存在 包含 類定義 的 各個 目標檔案 中. 使用 這個 pragma 指令 能夠 避免 這樣的 複製. 當 編譯 中 引用 包含 `#pragma interface ' 指令 的 頭檔案 時, 就 不會 產生 這些 輔助信息 (除非 輸入的 主檔案 使用了 `#pragma implementation '指令). 作為替代, 目標檔案 將包含 可被 連接時 解析的 引用 (reference).

#pragma implementation

#pragma implementation "objects.h"
    (僅對 C++) 如果 要求 從 頭檔案 產生 完整的 輸出 (並且 全局可見), 你 應該 在 主輸入檔案 中 使用 這條 pragma. 頭檔案 中 應該 依次 使用 `#pragma interface ' 指令. 在 implementation 檔案 中 將 產生 全部 內嵌成員函數 的 備份, 調試信息, 實現 虛函數 的 內部表格等.

    如果 `#pragma implementation ' 不帶 參數, 它 指的是 和 源檔案 有 相同基本名 的 包含檔案; 例如, `allclass.cc ' 中, `#pragma implementation ' 等於 `#pragma implementation allclass.h '. 如果 某個 implementation 檔案 需要 從 多個 頭檔案 引入 代碼, 就應該 使用 這個 字符串參數.

    不可能 把 一個頭檔案 裏面 的 內容 分割到 多個 implementation 檔案 中.

檔案 (FILE)
file.c	C 源檔案
file.h	C 頭檔案 (預處理檔案)
file.i	預處理後 的 C 源檔案
file.C	C++ 源檔案
file.cc	C++ 源檔案
file.cxx	C++ 源檔案
file.m	Objective-C 源檔案
file.s	匯編語言檔案
file.o	目標檔案
a.out	連接的輸出檔案
TMPDIR/cc*	臨時檔案
LIBDIR/cpp	預處理器
LIBDIR/cc1	C 編譯器
LIBDIR/cc1plus	C++ 編譯器
LIBDIR/collect	某些機器需要的連接器前端(front end)程式
LIBDIR/libgcc.a	GCC 子例程 (subroutine) 庫
/lib/crt[01n].o	啟動例程 (start-up)
LIBDIR/ccrt0	C++ 的附加啟動例程
/lib/libc.a	標準 C 庫, 另見 intro (3)
/usr/include	#include 檔案的標準目錄
LIBDIR/include	#include 檔案的標準 gcc 目錄
LIBDIR/g++-include	#include 檔案的附加 g++ 目錄

LIBDIR 通常為 /usr/local/lib/ machine/version.
TMPDIR 來自 環境變量 TMPDIR (如果 存在, 預設為 /usr/tmp , 否則為 /tmp ).

另見 (SEE ALSO)
cpp(1), as(1), ld(1), gdb(1), adb(1), dbx(1), sdb(1).
info 中 `gcc', `cpp', `as', `ld', 和 `gdb' 的 條目.
Using and Porting GNU CC (for version 2.0), Richard M. Stallman; The C Preprocessor, Richard M. Stallman; Debugging with GDB: the GNU Source-Level Debugger, Richard M. Stallman 和 Roland H. Pesch; Using as: the GNU Assembler, Dean Elsner, Jay Fenlason & friends; ld: the GNU linker, Steve Chamberlain 和 Roland Pesch.

BUGS
關於 報告 差錯 的 指導 請 查閱 GCC 手冊.

版權 (COPYING)
Copyright 1991, 1992, 1993 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.

作者 (AUTHORS)
關於 GNU CC 的 奉獻者 請 查閱 GUN CC 手冊.

[中文版維護人]
徐明 <xuming@users.sourceforge.net>

[中文版最新更新]
2003/05/13 第一版

《中國Linux論壇man手冊頁翻譯計劃》
http://cmpp.linuxforum.net