Provided by: manpages-zh_1.5.2-1.1_all bug

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
              所有 可能的 成員函數 預設為 虛函數. 所有的 成員函數  (除了  構造子函數  和  newdelete 成員操作符) 視為 所在類 的 虛函數.

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

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

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

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

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

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

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

       -fsigned-charchar 定義為 有符號 類型, 如同 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   宏定
                生效,  可以 用於 其他 輸入檔案.  處理 `-imacrosfile' 選項 之前, 預處理器 首先
              處理 `-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  庫檔案.

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

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

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

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

       -nostartfiles
              不連接 系統 標準啟動檔案, 而 標準庫檔案 仍然 正常 使用.

       -nostdlib
              不連接 系統 標準啟動檔案 和 標準庫檔案. 只把 指定的 檔案 傳遞給 連接器.

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

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

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

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

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

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

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

目錄選項 (DIRECTORY OPTION)

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

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

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

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

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

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

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

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

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

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

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

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

警告選項 (WARNING OPTION)

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

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

       -fsyntax-only
              檢查 程式 中 的 語法錯誤, 但是 不產生 輸出信息.

       -w     禁止 所有 警告訊息.

       -Wno-import
              禁止 所有 關於 #import 的 警告訊息.

       -pedantic
              打開  完全服從  ANSI C 標準 所需的 全部 警告診斷; 拒絕接受 採用了 被禁止的 語法擴展
              的 程式.

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

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

       -pedantic-errors
              該 選項 和 `-pedantic' 類似, 但是 顯示 錯誤 而不是 警告.

       -W     對 下列 事件 顯示 額外的 警告訊息:

          •   非易變自動變量  (nonvolatile automatic variable) 可能 在 調用 longjmp  發生 改變.
              這些 警告 僅在 優化編譯  發生.

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

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

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

              由於  GNU CC 不知道 某些 函數 永不返回 (含有 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 選項, 不管 帶不帶 數字, 最後一個 選項 才是 生效 的 選項.

       諸如  `-fflag' 此類  選項 描述 一些 機器無關  開關. 大多數 開關 具有 肯定  否定 兩種
       格式; `-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-typedefault, 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 函數 (memcpybcopy),
              而不是 生成 嵌入代碼.

       -mmips-tfile

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

       -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-typekb; 其他 選擇 有 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,dirdir 目錄  尋找 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
              一有可能 就 通過 寄存器 返回  structunion  函數值.  對於  較小的結構,  它  比
              -fpcc-struct-return 更有效率.

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

       -fshort-enumsenum 類型 只分配  聲明的 值域范圍  字節數. 就是說, 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