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