Scroll to navigation

GCC(1) GNU Tools 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). 源文件後綴名 標識 源文件 的 語言, 但是 對 編譯器 來說, 後綴名 控制着 缺省設定:

認爲 預處理後的 文件 (.i) 是 C 文件, 並且 設定 C 形式 的 連接.
認爲 預處理後的 文件 (.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)

明確 指出 後面 輸入文件 的 語言 爲 language (而不是 從 文件名後綴 得到的 默認選擇). 這個選項 應用於 後面 所有的 輸入文件, 直到 遇着 下一個 `-x' 選項. language 的 可選值 有 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', 和 `assembler-with-cpp'.
關閉 任何 對 語種 的 明確說明, 因此 依據 文件名後綴 處理 後面 的 文件 (就象是 從未 使用過 `-x' 選項).

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

編譯 或 彙編 源文件, 但是 不作 連接. 編譯器 輸出 對應於 源文件 的 目標文件.

缺省情況下, GCC 通過 用 `.o' 替換 源文件名後綴 `.c', `.i', `.s', 等等, 產生 目標文件名. 可以 使用 -o 選項 選擇 其他 名字.

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

編譯 後 即停止, 不進行 彙編. 對於 每個 輸入的 非彙編語言 文件, 輸出文件 是 彙編語言 文件.

缺省情況下, GCC 通過 用 `.o' 替換 源文件名後綴 `.c', `.i', 等等, 產生 目標文件名. 可以 使用 -o 選項 選擇 其他 名字.

GCC 忽略 任何 不需要 編譯 的 輸入文件.

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

GCC 忽略 任何 不需要 預處理 的 輸入文件.

指定 輸出文件 爲 file. 該選項 不在乎 GCC 產生 什麼 輸出, 無論是 可執行文件, 目標文件, 彙編文件 還是 預處理後的 C 代碼.

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

如果 沒有 使用 `-o' 選項, 默認的 輸出 結果 是: 可執行文件 爲 `a.out', `source.suffix' 的 目標文件 是`source.o', 彙編文件 是 `source.s', 而 預處理後的 C 源代碼 送往 標準輸出.

(在 標準錯誤) 顯示 執行 編譯 階段 的 命令. 同時 顯示 編譯器 驅動程序, 預處理器, 編譯器 的 版本號.
在 編譯過程 的 不同 階段 間 使用 管道 而非 臨時文件 進行 通信. 這個 選項 在 某些 系統 上 無法 工作, 因爲 那些 系統 的 彙編器 不能 從 管道 讀取 數據. GNU 的 彙編器 沒有 這個問題.

語言選項 (LANGUAGE OPTIONS)

下列 選項 控制 編譯器 能夠 接受 的 C "方言":

支持 符合 ANSI 標準的 C 程序.

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

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

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

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

不把 asm, inlinetypeof 當作 關鍵字, 因此 這些 詞 可以 用做 標識符. 用 __asm__, __inline____typeof__ 能夠 替代 他們. `-ansi' 隱含聲明瞭 `-fno-asm'.
不接受 不是 兩個 下劃線 開頭 的 內建函數 (built-in function). 目前 受影響 的 函數 有 _exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy, 和 strlen.

`-ansi' 選項 能夠 阻止 alloca_exit 成爲 內建函數.

按 宿主環境 編譯; 他 隱含 聲明瞭 `-fbuiltin' 選項, 而且 警告 不正確的 main 函數 聲明.
按 獨立環境 編譯; 他 隱含 聲明瞭 `-fno-builtin' 選項, 而且 對 main 函數 沒有 特別要求.

(譯註: 宿主環境 (hosted environment) 下 所有的 標準庫 可用, main 函數 返回 一個 int 值, 典型例子 是 除了 內核 以外 幾乎 所有的 程序. 對應的 獨立環境 (freestanding environment) 不存在 標準庫, 程序 入口 也 不一定是 main, 最明顯 的 例子 就是 操作系統內核. 詳情 參考 gcc 網站 最近的 資料)

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

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

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

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

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

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

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

爲 模板聲明 (template declaration) 產生 較小的 代碼 (僅限於 C++), 方法 是 對於 每個 模板函數 (template function), 只在 定義 他們 的 地方 生成 一個 副本. 想要 成功 使用 這個選項, 你 必須 在 所有 使用 模板 的 文件 中, 標記 `#pragma implementation' (定義) 或 `#pragma interface' (聲明).

當 程序 用 `-fexternal-templates' 編譯 時, 模板實例 (template instantiation) 全部是 外部類型. 你 必須 讓 需要的 實例 在 實現文件 中 出現. 可以 通過 typedef 實現 這一點, 他 引用 所需的 每個 實例. 相對應的, 如果 編譯時 使用 缺省選項 `-fno-external-templates', 所有 模板實例 明確的 設爲 內置.

所有 可能的 成員函數 默認爲 虛函數. 所有的 成員函數 (除了 構造子函數 和 newdelete 成員操作符) 視爲 所在類 的 虛函數.

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

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

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

char 定義爲 無符號 類型, 如同 unsigned char.

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

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

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

char 定義爲 有符號 類型, 如同 signed char.

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

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

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

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

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

預處理器選項 (Preprocessor Option)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

彙編器選項 (ASSEMBLER OPTION)

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

連接器選項 (LINKER OPTION)

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

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

連接 名爲 library 的 庫文件.

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

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

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

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

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

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

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

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

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

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

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

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

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

目錄選項 (DIRECTORY OPTION)

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

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

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

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

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

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

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

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

編譯器 驅動程序 需要 執行 某些 下面的 子程序: `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 產生 的 警告 的 數量 和 類型:

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

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

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

-pedantic-errors
該 選項 和 `-pedantic' 類似, 但是 顯示 錯誤 而不是 警告.
對 下列 事件 顯示 額外的 警告信息:
   •
非易變自動變量 (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.

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

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

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

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

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

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

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

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

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

這些警告 只可能 做 優化編譯 時 出現, 因爲 他們 需要 數據流信息, 只有 做 優化 的 時候 才 估算 數據流信息. 如果 不指定 `-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 可以 避免 某些 似是而非的 警告.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

調試選項 (DEBUGGING OPTION)

GNU CC 擁有 許多 特別選項, 既可以 調試 用戶的 程序, 也可以 對 GCC 排錯:

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

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

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

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

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

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

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

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

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

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

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

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

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

-glevel
-ggdblevel
-gstabslevel
-gcofflevel -gxcofflevel

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

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

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

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

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

產生 額外代碼, 用於 輸出 基本塊 (basic block) 的 profile 信息, 它 記錄 各個 基本塊 的 執行 次數, 供 諸如 tcov 此類 的 程序 分析. 但是 注意, 這個 數據格式 並非 tcov 期待的. 最終 GNU gprof 將 處理 這些數據.
產生 額外代碼, 用於 從 '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__' 導致 在 跟蹤 中 包括 返回指令.

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

預處理 結束 的 時候 轉儲 所有的 宏定義, 不輸出到 文件.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

產生 以上 所有的 轉儲.

運行結束後, 在 標準錯誤 顯示 內存使用統計.

在 彙編輸出 加註 指明 使用了 哪些 模式 (pattern) 及其 替代模式.

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

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

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

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

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

優化選項 (OPTIMIZATION OPTION)

這些選項 控制 多種 優化措施:

優化. 對於 大函數, 優化編譯 佔用 稍微多 的 時間 和 相當大 的 內存.

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

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

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

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

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

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

不優化.

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

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

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

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

使用 探索法 (heuristic) 進行 更快的 編譯 (僅對 C++). 默認情況下 不使用 探索法. 由於 探索法 只對 某些 輸入文件 有效, 其他程序 的 編譯速度 會變得 更慢.

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

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

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

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

默認爲 不要 把 成員函數 內嵌, 因爲 它們 定義在 類的 作用域 內 (僅C++).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

目標機選項 (TARGET OPTION)

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

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

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

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

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

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

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

機器相關選項 (MACHINE DEPENDENT OPTION)

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

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

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

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

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

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

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

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

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

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

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

認爲 int 類型 是 16 位寬, 相當於 short int.

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

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

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

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

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

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

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

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

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

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

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

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

-mfpu

輸出 包含 浮點指令 的 目標碼. 這是 缺省選項.

-mno-fpu

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

-msoft-float 改變了 輸出文件 中的 調用約定; 因此 只有 用 這個 選項 編譯 整個 程序 纔有 意義.

-mno-epilogue

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

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

-mno-v8

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

默認情況下 (除非 特別爲 Fujitsu SPARClite 配置), GCC 生成 SPARC v7 目標碼.

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

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

-mcypress

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

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

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

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

輸出 C1 的 目標碼. 當 編譯器 對 C1 配置時, 這是 默認選項.
輸出 C2 的 目標碼. 當 編譯器 對 C2 配置時, 這是 默認選項.
在 每個 參數列表 的 前面 放置 一個 參數計數字 (argument count word). 某些 不可移植 的 Convex 和 Vax 程序 需要 這個 參數計數字. (調試器 不需要 他, 除非 函數 帶有 變長參數 列表; 這個 信息 存放在 符號表 中.)

忽略 參數計數字. 如果 你 使用 未改裝 的 gcc, 這是 默認 選項.

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

生成的 目標碼 認爲 DW 置位, 就是說, 字節 和 半字 操作 由 硬件 直接 支持. 該選項 是 默認選項.
生成的 目標碼 認爲 DW 沒有 置位.
生成的 目標碼 認爲 系統 支持 字節 和 半字 寫操作. 該選項 是 默認選項.
生成的 目標碼 認爲 系統 不支持 字節 和 半字 寫操作. 該選項 隱含 開啓 了 `-mnodw' 選項.
使用 小內存模式, 小內存模式 假設 所有 函數 的 地址 位於 某個 256 KB 段內, 或者 所有 函數 的 絕對地址 小於 256K. 這樣 就可以 用 call 指令 代替 const, consth, calli 指令 序列.
假設 不能 使用 call 指令; 這是 默認選項.
輸出 Am29050 的 目標碼.
輸出 Am29000 的 目標碼. 這是 默認選項.
-mkernel-registers
生成的 目標碼 引用 gr64-gr95 寄存器 而不是 gr96-gr127 寄存器. 該選項 可以 用於 編譯 內核代碼, 內核 需要 一組 全局寄存器, 這些 全局寄存器 和 用戶模式 使用的 寄存器 完全無關.

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

使用 普通 全局寄存器集 gr96-gr127. 這是 默認選項.
在 每次 堆棧 調整 後 插入 一條 __msp_check 調用. 這個選項 常用於 內核代碼.

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

生成的 目標碼 可以 在 m88100 和 m88110 上 正常工作.
生成的 目標碼 在 m88100 上 工作的 最好, 但也可以 在 m88110 上 運行.
生成的 目標碼 在 m88110 上 工作的 最好, 可能 不能 在 m88100 上 運行.
在 彙編器 的 輸出端 包含 一條 ident 指令, 記錄 源文件名, 編譯器名字 和 版本, 時標, 以及 使用的 編譯選項,
在 彙編器 的 輸出端, 符號名字 前面 不添加 下劃線. 默認情況 是 在 每個 名字 前面 增加 下劃線 前綴.
早期 型號 的 88K 系統 在 除零操作 上 存在 問題, 特定情況下 許多 機器 無法 自陷. 使用 這些 選項 可以 避免包含 (或 可以 顯明包含) 附加的 代碼, 這些代碼 能夠 檢查 除零錯, 發送 例外信號. GCC 所有 88K 的 配置 默認 使用 `-mcheck-zero-division' 選項.
包含 (或忽略) 附加的 調試信息 (關於 每個 棧架結構 中 寄存器 的 使用), 88Open Object Compatibility Standard, “OCS”, 對 此信息 做了 說明. GDB 不需要 這些 額外信息. DG/UX, SVr4, 和 Delta 88 SVr3.2 的 默認配置 是 包含 調試信息, 其他 88k 機型 的 默認配置 是 忽略 這個信息.
強制 (或 不要求) 把 寄存器值 存儲到 棧架結構 中的 指定位置 (按 OCS 的說明). DG/UX, Delta88 SVr3.2 和 BCS 的 默認配置 使用 `-mocs-frame-position' 選項; 其他 88k 機型 的 默認配置 是 `-mno-ocs-frame-position'.
控制 如何 在 堆棧結構 中 存儲 函數參數. `-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

產生, 或 不產生 代碼 來保證 對 易變內存訪問 的 結果一致.

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

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

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

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

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

-msvr4

打開 (`-msvr4') 或 關閉 (`-msvr3') 和 System V 第四版 (SVr4) 相關的 編譯器擴展. 效果 如下:
   •
輸出 哪種 彙編語法 (你 可以 使用 `-mversion-03.00' 選項 單獨 選擇).
   •
`-msvr4' 使 C 預處理器 識別 `#pragma weak' 指令
   •
`-msvr4' 使 GCC 輸出 額外的 聲明指令(declaration directive), 用於 SVr4.

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

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

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

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

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

下面的選項 用於 IBM RS6000:

-mfp-in-toc

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

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

對於 整數乘法 使用 嵌入代碼. 這是 默認選項.
對於 整數乘法 使用 lmul$$ .
生成 全尺寸 浮點數據塊, 包括 IBM 建議 的 最少數量 的 活動空間 (scratch space). 這是 默認選項.
不要 在 浮點數據塊 中 包括 額外的 活動空間. 這樣 就 產生 較小 但是 略慢 的 可執行程序, 因爲 活動空間 必須 動態分配.
採用 不兼容 IBM 調用約定 的 調用序列, 通過 浮點寄存器 傳送 浮點參數. 注意, 如果 指定了 這個選項, varargs.hstdargs.h 將 無法 支持 浮點單元.

使用 正常的 調用約定 處理 浮點參數. 這是 默認選項.

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

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

下面的 `-m' 選項 用於 MIPS 家族 的 計算機:

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

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

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

這些 選項 目前 不起作用.

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

產生 用於 GNU 彙編器 的 代碼. 在 OSF/1 參考平臺 上 這是 默認選項, 它 使用 OSF/rose 目標 格式.

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

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

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

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

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

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

輸出 包含 浮點指令. 如果 編譯器 沒有 被改動, 這就是 默認選項.

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

認爲 存在 32 32-bit 浮點寄存器. 這是 默認選項.

-mabicalls

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

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

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

彙編 用戶彙編文件 (帶有 `.s' 後綴) 時, 告訴 MIPS 彙編器 不要 運行 預處理器.

下面的 `-m' 選項 用於 Intel 80386 族 計算機: -m486

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

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

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

不用 FPU 寄存器 返回 函數值.

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

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

下面的 `-m' 選項 用於 HPPA 族 計算機:

生成 PA 1.0 處理器 的 目標碼.
生成 PA 1.1 處理器 的 目標碼.

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

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

不生成 連接 HP-UX 共享庫 的 目標碼. 這是 PA 目標 的 默認選項.

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

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

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

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

下面的 `-m' 選項 用於 Intel 80960 族 計算機:

默認 機器 類型 爲 cpu-type , 使 編譯器 產生 對應的 指令, 地址模式 和 內存對齊. 默認的 cpu-typekb; 其他 選擇 有 ka, mc, ca, cf, sa, 和 sb.

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

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

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

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

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

兼容 iC960 v2.0 或 v3.0.

兼容 iC960 彙編器.

不允許 (或允許) 邊界不對齊 的 訪問.

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

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

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

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

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

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

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

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

驗證 編譯器 用的 工具 的 版本, 輸出到 .ident 彙編指令.

制止 輸出端 的 .ident 指令 (默認選項).

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

dir 目錄 中 尋找 M4 預處理器. 彙編器 使用 這個 選項.

代碼生成選項 (CODE GENERATION OPTION)

下面的 選項 和 平臺 無關, 用於 控制 目標碼生成 的 接口約定.

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

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

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

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

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

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

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

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

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

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

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

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

忽略 `#ident' 指令.

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

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

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

使 編譯器 認爲 所有 通過 指針 訪問 的 內存 是 易變內存 (volatile).

-fvolatile-global
使 編譯器 認爲 所有的 外部和全局變量 是 易變內存.

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

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

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

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

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

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

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

GNU Tools