Provided by: manpages-zh_1.5.1-1_all bug

NAME

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

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

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

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

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

       如果  需n  完整  和  最新  的 文件, 請 查 Info 檔案 `gcc' 或 Using and
       Porting GNU CC (for version 2.0) (M GNU CC 2.0)   手冊.   二者
       均 來自 Texinfo 嚓仵 gcc.texinfo.

yz (DESCRIPTION)
       C  和  C++  編譯器  是  集成的. 他 都n 用 四茖B驟 中的 一 或 多 處理
       輸入檔案: 預處理(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).  這裏 只列舉 不是 預設選項 的 格式.

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

      ` (Overall Option)
              -c -S -E -o file -pipe -v -x language

      y (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

      i (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

      u (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

      wBz (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

      s (Assembler Option)
              -Wa,option

      s (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

      tm (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

      NX (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' 選項).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       -ansi  支持 符合 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 標準 調用; 這樣 就不會 幹擾 在
              其他地方 使用 這些 名字 的 程式 了.

       -fno-asm
              不把 asm, inlinetypeof 當作 關鍵字, 因此 這些 詞  可以  用做
              標識符.  用  __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 函數 沒有 特別n求.

              (譯注: 宿主環境 (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-equivint 類型 到 枚舉類型 (enumeration) 的 隱式轉換  (僅於  C++).
              正常情況下 GNU C++ 允 從 enumint 的 轉換, 反之則 不行.

       -fexternal-templates
              為  模板聲明 (template declaration) 產生 較小的 代碼 (僅於 C++),
              方法 是 對於 每 模板函數 (template function), 只在 定義 他  的
              地方  生成  一 副本. 想n 成 使用 這蚇龠, 你 必須 在 所有 使用
              模板  的  檔案  中,  標記  `#pragma  implementation'  (定義)  或
              `#pragma interface' (聲明).

              當  程式  用  `-fexternal-templates' 編譯 時, 模板實例 (template
              instantiation) 全部是  外部類型.   你  必須  讓  需n的  實例  在
              實現檔案  中 出現. 可以 通過 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 charunsigned char. 但是 釵h 程式 已經 寫成 只用
              簡單的 char, 並且 期待 這是 有符號數  (或者  無符號數,  具體情況
              取決於  編寫  程式  的  目標機器). 這蚇龠, 和 它的 反義選項, 使
              那樣的 程式 工作在 對應的 預設 上.

              char 的 類型 始終 應該 明確定義 為 signed charunsigned 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' 袡3, 這些 選項 用來
              定義 有符號位域 (bitfield) 或 無符號位域.  預設情況下,  位域  是
              有符號 的, 因為 他 繼承的 基本 整數類型, 如 int, 是 有符號數.

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

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

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

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

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

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

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

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

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

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

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

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

       -nostdinc++
              不n 在 C++ 專用標準目錄 中 尋找  頭檔案,  但是  仍然  搜索  其他
              標準目錄.  (當 建立 `libg++' 時 使用 這蚇龠.)

       -undef 不n 預定義 任何 非標準宏. (包括 系統結構 標誌).

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

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

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

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

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

              `-MG'  n求  把  缺失的  頭檔案  按  存在  對待, 並且 假定 他 和
              源程式檔案 在 同一目錄 下. 必須 和 `-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-'  關閉
              一般用於 描z 目標機 的 標準 斷言.

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

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

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

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

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

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

s (ASSEMBLER OPTION)
       -Wa,option
              把 選項 option 傳遞給 匯編器.  如果 option 含有 逗號, 就在  逗號
              處 分割成 多 選項.

s (LINKER OPTION)
       下悸  選項  用於  編譯器  連接 目標檔案, 輸出 可執行檔案 的 時.  如果
       編譯器 不進行 連接, 他 就 毫無意義.

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

       -llibrary
              連接 名為 library 的 庫檔案.

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

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

              一般說來 用 這茪隤k 找到的 檔案 是 庫檔案--即由 目標檔案  組成的
              歸檔檔案  (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 無法 識別 這些 選項.

              如果 需n 傳遞 攜帶 參數 的 選項, 你 必須 使用  兩次  `-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
              這蚇龠 指出 在何處 尋找 可執行檔案, 庫檔案, 以及 編譯器 自己 的
              數據檔案.

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

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

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

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

i (WARNING OPTION)
       警告  是  針對 程式結構 的 診斷信息, 程式 不一定 有錯誤, 而是 存在 滅I,
       或者 可能 存在 錯誤.

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

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

       -w     禁止 所有 警告訊息.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       -Wimplicit
              同 -Wimplicit-int 和 -Wimplicit-function-declaration.

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

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

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

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

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

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

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

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

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

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

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

              注意,  如果 某蚥僆q 只 p算了 一 從未使用過 的 , 這裏 可能 不會
              警告.  因為 在 顯示 警告 之前, 這樣 的 p算  已經  被  數據流分析
              刪除 了.

              這些警告  作為  可選項  是因為  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  結合 所有 上z 的 `-W' 選項. 通常 我  建議  避免  這些  被警告的
              用法,我 相信, 恰當 結合 宏 的 使用 能夠 輕易 避免 這些 用法。

       剩下的  `-W...' 選項 不包括 在 `-Wall' 中, 因為 我 認為 在 必n情況 下,
       這些 被 編譯器 警告 的 程式結構, 可以 合理的 用在 "幹凈的" 程式 中.

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

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

          o   某茖蝻 在 塊(block) 中 聲明為 外部, 但在 塊 結束後 才 調用.

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

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

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

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

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

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

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

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

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

       -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  擁有  釵h  特別選項,  既可以 調試 使用者的 程式, 也可以 對 GCC
       排錯:

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

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

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

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

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

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

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

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

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

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

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

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

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

       -glevel
       -ggdblevel
       -gstabslevel
       -gcofflevel -gxcofflevel

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

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

              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__' 導P
              跳轉 (jump) 頻率 寫進 `bb.out'.  `__bb_trace__' 導P 基本塊  序列
              通過    管道    傳到    `gzip',    輸出    `bbtrace.gz'    檔案.
              `__bb_hidecall__'  導P  從  跟蹤  (trace)  中  排除  call  指令.
              `__bb_showret__' 導P 在 跟蹤 中 包括 返回指令.

       -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    運行結束後, 在 標準錯誤 顯示 記憶體使用統p.

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

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

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

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

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

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

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

       -O

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

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

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

              使用了 `-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' 此類 的 選項 描z 一些 機器無關 的 開關. 大多數 開關 具有
       肯定 和 否定 兩種格式; `-ffoo' 開關選項 的 否定格式 應該是  `-fno-foo'.
       下悸  列表  只展示了  一種 格式 -- 那 不是 預設選項 的 格式.  你 可以
       通過 去掉 或 添加 `no-' 構造出 另一種 格式.

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

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

       -fmemoize-lookups

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

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

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

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

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

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

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

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

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

       -fomit-frame-pointer
              對於 不需n 幀指針 (frame pointer) 的 函數, 不n 在 寄存器 中 保存
              幀指針.  這樣 能夠 避免 保存, 設置 和 恢復 幀指針 的 指令;  同時
              對  釵h  函數  提供  一 額外的 寄存器. O b jh  WN
              Lk .

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

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

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

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

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

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

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

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

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

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

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

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

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

       如果 特別情況 下 非常 需n "微調" 優化, 你 可以 使用 下悸 選項.

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

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

       -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' 選項 將導P CSE 跟在 if
              產生 的 跳轉 後.

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

       -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
              執行 一些 相對 開銷 較大 的 次n 優化.

       -fdelayed-branch
              如果 對 目標機 支持 這 弁, 它 試圖 奐s 排列  指令,  以便  利用
              延遲分支 (delayed branch) 指令 後悸 指令 空隙.

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

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

 (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, 有沒有
       浮點協處理器. 通過 指定 選項, 安裝 編譯器 的 一 版本  能夠  為  所有的
       型號 或 配置 進行 編譯.

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

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

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

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

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

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

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

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

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

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

       下惇O 針對 VAX 定義 的 `-m' 選項:

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

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

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

       下惇O SPARC 支持的 `-m' 選項開關:

       -mfpu

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

       -mno-fpu

       -msoft-float
              輸出  包含  浮點庫調用  的 目標碼.  i: 沒有 為 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 目標碼 唯一的 區別 是,
              編譯器 生成 整數憚k 和 整數除法 指令, SPARC v8 支持  該指令,  而
              v7 體系 不支持.

              -msparclite 生成 SPARClite 目標碼. 增加了 SPARClite 支持的 整數-
              憚k, 整數除法單步掃描 (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 指令集.

       下惇O 針對 Convex 定義 的 `-m' 選項:

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

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

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

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

       下惇O 針對 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 寄存器.
              該選項 可以 用於 編譯 核心代碼, 核心 需n 一組  全局寄存器,  這些
              全局寄存器 和 使用者模式 使用的 寄存器 完全無關.

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

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

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

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

       -mocs-debug-info

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

       -mocs-frame-position

       -mno-ocs-frame-position
              強制 (或 不n求) 把 寄存器 存儲到 棧架結構 中的 指定位置 (按 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
              產生, 或 不產生 代碼 來保証 對 易變記憶體訪問 的 結果一P.

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

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

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

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

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

       -msvr4

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

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

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

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

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

       -mtrap-large-shift

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

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

       -mversion-03.00
              在 DG/UX 配置 中 存在 兩種 榆 的 SVr4.  這蚇龠  蚹  -msvr4  ,
              選擇 hybrid-COFF 或 real-ELF 榆. 其他 配置 均 忽略 該選項.

       -mwarn-passed-structs
              如果  某茖蝻  把  結構  當做  參數 或 結果 傳遞, GCC 發出 警告.
              隨著 C 語言 的 發展, 人 已經 改變了 傳遞 結構 的 約定, 它  往往
              導P 移植問題. 預設情況下, 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
              對於 整數憚k 使用 嵌入代碼. 這是 預設選項.

       -mcall-lib-mul
              對於 整數憚k 使用 lmul$$ .

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

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

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

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

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

       -mnohc-struct-return
              如果可以, 通過  寄存器  返回  某些  大於  一茼r  的  結構.  這是
              預設選項.    如果   打算   相容   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 添加 普通的
              調試信息. 對於 大多數 孕x 這是 預設選項, 除了 OSF/1 參考孕x,  它
              使用  OSF/rose  目標  格式. 如果 打開了 任一 -ggdb, -gstabs, 或
              -gstabs+ 選項開關, mips-tfile 程式 就把 stab 封裝在  MIPS  ECOFF
              裏.

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

       -mrnames

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

       -mgpopt

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

       -mstats

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

       -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
              輸出  包含  浮點庫調用.   i:  所需庫  不是  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 開關選項 n求 把 外部引用 的 指針  放到  數據段,  並且
              載入 記憶體, 而不放到 正文段. 該選項 目前 不起作用.

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

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

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

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

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

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

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

              通常 函數調用約定 把 floatdouble 的 返回  放在  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
              生成  適用於 核心 的 目標碼. 特別n 避免 add 指令, 它 有 一 參數
              是 DP 寄存器; 用 addil 代替 add指令. 這樣 可以 避免 HP-UX 連接器
              的 某 嚴 bug.

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

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

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

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

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

       -mtail-call

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

       -mcomplex-addr

       -mno-complex-addr
              認為 (或 不認為) 在 當前的 i960 設備 上, o  使用  復合地址模式
              (complex  addressing mode). 復合地址模式 可能 不o 用到 K 系列,
              但是 一定 o 用在 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 也n求 擁有 浮點寄存器.

       -mfp-reg

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

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

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

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

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

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

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

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

NX (CODE GENERATION OPTION)
       下悸 選項 和 孕x 無關, 用於 控制 目標碼生成 的 接口約定.

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

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

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

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

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

       -fpcc-struct-return
              函數 返回  structunion  ,  採用  和  本地編譯器  相同的
              參數約定. 對於 較小的結構, 這種約定 的 效率 偏低, 而且 很多 機器
              上 不能 咫J; 它的 優點 是 允 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
              n求  編譯結果  的  數據  和  非  const  變量 是 共享數據, 而不是
              私有數據.   這種差別  僅在  某些  作業系統  上  有意義,  那裏的
              共享數據  在  同一 程式 的 Y幹 進程 間 共享, 而 私有數據 在 每
              進程 內 都有 副件.

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

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

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

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

       -fverbose-asm
              輸出 匯編代碼 時 放些 額外的 注釋信息. 這蚇龠 僅用於  確實  需n
              嬝 匯編輸出 的 時 (可能 調試 編譯器 自己 的 時).

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

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

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

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

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

              reg 必須是 寄存器 的 名字. 寄存器 名字 取決於 機器,  用  機器描-
              z宏檔案 的 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++) 如果 n求 從 頭檔案 產生 完整的 輸出 (並且  全局可見),
              你  應該  在 主輸入檔案 中 使用 這條 pragma. 頭檔案 中 應該 依次
              使用 `#pragma interface' 指令. 在 implementation 檔案 中 將 產生
              全部 內嵌成函數 的 備份, 調試信息, 實現 虛函數 的 內部表格等.

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

              不可能  把  一蚗Y檔案 裏 的 內容 分割到 多 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     某些機器需n的連接器前端(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).

t (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 手冊.

v (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 第一版

mLinuxanhttp://cmpp.linuxforum.net