Manpages

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, 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 函 數 沒 有 特 別 要 求 .

(譯 註 : 宿 主 環 境 (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++ 允 許 從 enumint 的 轉 換 , 反 之 則 不 行 .

−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−char

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

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

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

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

−fsigned−char

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

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

−fsigned−bitfields
−funsigned−bitfields
−fno−signed−bitfields
−fno−unsigned−bitfields

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

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

−fwritable−strings

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

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

預 處 理 器 選 項 (Preprocessor Option)

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

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

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

−imacros file

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

−idirafter dir

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

−iprefix prefix

指 定 prefix 作 爲 後 續 ’−iwithprefix’ 選 項 的 前 綴 .

−iwithprefix dir

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

−nostdinc

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

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

−nostdinc++

不 要 在 C++ 專 用 標 準 目 錄 中 尋 找 頭 文 件 , 但 是 仍 然 搜 索 其 他 標 準 目 錄 . (當 建 立 ’libg++’ 時 使 用 這 個 選 項 .)

−undef

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

−E

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

−C

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

−P

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

−M  [ −MG ]

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

−M’ 隱 含 了 ’−E’ 選 項 .

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

−MM  [ −MG ]

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

−MD

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

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

−MMD

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

−H

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

−Aquestion(answer)

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

−Dmacro

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

−Dmacro=defn

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

−Umacro

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

−dM

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

−dD

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

−dN

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

彙 編 器 選 項 (ASSEMBLER OPTION)

−Wa,option

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

連 接 器 選 項 (LINKER OPTION)

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

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

−llibrary

連 接 名 爲 library 的 庫 文 件 .

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

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

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

−lobjc

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

−nostartfiles

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

−nostdlib

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

−static

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

−shared

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

−symbolic

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

−Xlinker option

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

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

−Wl,option

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

−u symbol

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

目 錄 選 項 (DIRECTORY OPTION)

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

−Idir

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

−I−

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

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

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

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

−Ldir

在 ’−l’ 選 項 的 搜 索 路 徑 列 表 中 添 加 dir 目 錄 .

−Bprefix

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

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

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

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

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

警 告 選 項 (WARNING OPTION)

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

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

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

−w

禁 止 所 有 警 告 信 息 .

−Wno−import

禁 止 所 有 關 於 #import 的 警 告 信 息 .

−pedantic

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

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

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

−pedantic−errors

該 選 項 和 ’−pedantic’ 類 似 , 但 是 顯 示 錯 誤 而 不 是 警 告 .

−W

對 下 列 事 件 顯 示 額 外 的 警 告 信 息 :

    •

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

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

    •

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

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

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

    •

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

    •

無 符 號 數 用 ’>’ 或 ’<=’ 和 零 做 比 較 .

−Wimplicit-int

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

−Wimplicit-function-declaration

警 告 在 聲 明 之 前 就 使 用 的 函 數 .

−Wimplicit

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

−Wmain

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

−Wreturn−type

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

−Wunused

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

−Wswitch

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

−Wcomment

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

−Wtrigraphs

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

−Wformat

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

−Wchar−subscripts

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

−Wuninitialized

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

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

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

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

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

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

如 果 y 始 終 是 1, 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
−ggdb
level
−gstabs
level
−gcoff
level −gxcofflevel
−gdwarf
level

請 求 生 成 調 試 信 息 , 同 時 用 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.hstdargs.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 寄 存 器 返 回 函 數 值 .

通 常 函 數 調 用 約 定 把 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

生 成 適 用 於 內 核 的 目 標 碼 . 特 別 要 避 免 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 族 計 算 機 :
−m
cpu-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,dir

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

代 碼 生 成 選 項 (CODE GENERATION OPTION)

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

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

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

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

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

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

−fpcc−struct−return

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

−freg−struct−return

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

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

−fshort−enums

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

−fshort−double

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

−fshared−data

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

−fno−common

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

−fno−ident

忽 略 ’#ident’ 指 令 .

−fno−gnu−linker

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

−finhibit-size-directive

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

−fverbose-asm

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

−fvolatile

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

−fvolatile−global

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

−fpic

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

−fPIC

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

−ffixed−reg

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

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

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

−fcall−used−reg

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

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

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

−fcall−saved−reg

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

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

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

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

PRAGMAS

GNU C++ 支 持 兩 條 ’#pragma’ 指 令 使 同 一 個 頭 文 件 有 兩 個 用 途 : 對 象 類 的 接 口 定 義 , 對 象 類 完 整 的 內 容 定 義 .
#pragma interface

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

#pragma implementation
#pragma implementation "
objects.h"

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

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

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

文 件 (FILE)

file.c C 源 文 件

file.h

C 頭 文 件 (預 處 理 文 件 )

file.i

預 處 理 後 的 C 源 文 件

file.C

C++ 源 文 件

file.cc

C++ 源 文 件

file.cxx

C++ 源 文 件

file.m

Objective-C 源 文 件

file.s

彙 編 語 言 文 件

file.o

目 標 文 件

a.out

連 接 的 輸 出 文 件

TMPDIR/cc∗

臨 時 文 件

LIBDIR/cpp

預 處 理 器

LIBDIR/cc1

C 編 譯 器

LIBDIR/cc1plus

C++ 編 譯 器

LIBDIR/collect

某 些 機 器 需 要 的 連 接 器 前 端 (front end)程 序

LIBDIR/libgcc.a

GCC 子 例 程 (subroutine) 庫

/lib/crt[01n].o

啓 動 例 程 (start-up)

LIBDIR/ccrt0

C++ 的 附 加 啓 動 例 程

/lib/libc.a

標 準 C 庫 , 另 見 intro (3)

/usr/include

#include 文 件 的 標 準 目 錄

LIBDIR/include

#include 文 件 的 標 準 gcc 目 錄

LIBDIR/g++−include

#include 文 件 的 附 加 g++ 目 錄

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

另 見 (SEE ALSO)

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

BUGS

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

版 權 (COPYING)

Copyright 1991, 1992, 1993 Free Software Foundation, Inc.

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

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

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

作 者 (AUTHORS)

關 於 GNU CC 的 奉 獻 者 請 查 閱 GUN CC 手 冊 .

[中 文 版 維 護 人 ]

徐 明 <xuming [AT] users.net>

[中 文 版 最 新 更 新 ]

2003/05/13 第 一 版

《 中 國 Linux論 壇 man手 冊 頁 翻 譯 計 劃 》

http://cmpp.linuxforum.net

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