NAME
gcc, g++ − GNU 工 程 的 C 和 C++ 编 译 器 (egcs-1.1.2)
总 览 (SYNOPSIS)
gcc [
option | filename ]...
g++ [ option | filename ]...
警 告 (WARNING)
本 手 册 页 内 容 摘 自 GNU C 编 译 器 的 完 整 文 档 , 仅 限 于 解 释 选 项 的 含 义 .
除 非 有 人 自 愿 维 护 , 否 则 本 手 册 页 不 再 更 新 . 如 果 发 现 手 册 页 和 软 件 之 间 有 所 矛 盾 , 请 查 对 Info 文 件 , Info 文 件 是 权 威 文 档 .
如 果 我 们 发 觉 本 手 册 页 的 内 容 由 于 过 时 而 导 致 明 显 的 混 乱 和 抱 怨 时 , 我 们 就 停 止 发 布 它 . 不 可 能 有 其 他 选 择 , 象 更 新 Info 文 件 同 时 更 新 man 手 册 , 因 为 其 他 维 护 GNU CC 的 工 作 没 有 留 给 我 们 时 间 做 这 个 . GNU 工 程 认 为 man 手 册 是 过 时 产 物 , 应 该 把 时 间 用 到 别 的 地 方 .
如 果 需 要 完 整 和 最 新 的 文 档 , 请 查 阅 Info 文 件 ’gcc’ 或 Using and Porting GNU CC (for version 2.0) (使 用 和 移 植 GNU CC 2.0) 手 册 . 二 者 均 来 自 Texinfo 原 文 件 gcc.texinfo.
描 述 (DESCRIPTION)
C 和 C++ 编 译 器 是 集 成 的 . 他 们 都 要 用 四 个 步 骤 中 的 一 个 或 多 个 处 理 输 入 文 件 : 预 处 理 (preprocessing), 编 译 (compilation), 汇 编 (assembly) 和 连 接 (linking). 源 文 件 后 缀 名 标 识 源 文 件 的 语 言 , 但 是 对 编 译 器 来 说 , 后 缀 名 控 制 着 缺 省 设 定 :
gcc |
认 为 预 处 理 后 的 文 件 (.i) 是 C 文 件 , 并 且 设 定 C 形 式 的 连 接 . | ||
g++ |
认 为 预 处 理 后 的 文 件 (.i) 是 C++ 文 件 , 并 且 设 定 C++ 形 式 的 连 接 . |
源 文 件 后 缀 名 指 出 语 言 种 类 以 及 后 期 的 操 作 :
.c C 源 程 序 ; 预 处 理 , 编 译 , 汇 编
.C | ||
C++ 源 程 序 ; 预 处 理 , 编 译 , 汇 编 | ||
.cc | ||
C++ 源 程 序 ; 预 处 理 , 编 译 , 汇 编 | ||
.cxx | ||
C++ 源 程 序 ; 预 处 理 , 编 译 , 汇 编 | ||
.m | ||
Objective-C 源 程 序 ; 预 处 理 , 编 译 , 汇 编 | ||
.i | ||
预 处 理 后 的 C 文 件 ; 编 译 , 汇 编 | ||
.ii | ||
预 处 理 后 的 C++ 文 件 ; 编 译 , 汇 编 | ||
.s | ||
汇 编 语 言 源 程 序 ; 汇 编 | ||
.S | ||
汇 编 语 言 源 程 序 ; 预 处 理 , 汇 编 | ||
.h | ||
预 处 理 器 文 件 ; 通 常 不 出 现 在 命 令 行 上 |
其 他 后 缀 名 的 文 件 被 传 递 给 连 接 器 (linker). 通 常 包 括 :
.o | ||
目 标 文 件 (Object file) | ||
.a | ||
归 档 库 文 件 (Archive file) |
除 非 使 用 了 −c, −S, 或 −E 选 项 (或 者 编 译 错 误 阻 止 了 完 整 的 过 程 ), 否 则 连 接 总 是 最 后 的 步 骤 . 在 连 接 阶 段 中 , 所 有 对 应 于 源 程 序 的 .o 文 件 , −l 库 文 件 , 无 法 识 别 的 文 件 名 (包 括 指 定 的 .o 目 标 文 件 和 .a 库 文 件 ) 按 命 令 行 中 的 顺 序 传 递 给 连 接 器 .
选 项 (OPTIONS)
选 项 必 须 分 立 给 出 : ’−dr’ 完 全 不 同 于 ’−d −r ’.
大 多 数 ’−f’ 和 ’−W’ 选 项 有 两 个 相 反 的 格 式 : −fname 和 −fno−name (或 −Wname 和 −Wno−name). 这 里 只 列 举 不 是 默 认 选 项 的 格 式 .
下
面 是 所 有 选 项
的 摘 要 , 按 类 型
分 组 , 解 释 放 在
后 面 的 章 节 中 .
总 体 选 项 (Overall Option)
−c −S −E −o file −pipe −v −x language
语 言 选 项 (Language Option)
−ansi −fall−virtual −fcond−mismatch −fdollars−in−identifiers −fenum−int−equiv −fexternal−templates −fno−asm −fno−builtin −fhosted −fno−hosted −ffreestanding −fno−freestanding −fno−strict−prototype −fsigned−bitfields −fsigned−char −fthis−is−variable −funsigned−bitfields −funsigned−char −fwritable−strings −traditional −traditional−cpp −trigraphs
警 告 选 项 (Warning Option)
−fsyntax−only −pedantic −pedantic−errors −w −W −Wall −Waggregate−return −Wcast−align −Wcast−qual −Wchar−subscript −Wcomment −Wconversion −Wenum−clash −Werror −Wformat −Wid−clash−len −Wimplicit −Wimplicit−int −Wimplicit−function−declaration −Winline −Wlong−long −Wmain −Wmissing−prototypes −Wmissing−declarations −Wnested−externs −Wno−import −Wparentheses −Wpointer−arith −Wredundant−decls −Wreturn−type −Wshadow −Wstrict−prototypes −Wswitch −Wtemplate−debugging −Wtraditional −Wtrigraphs −Wuninitialized −Wunused −Wwrite−strings
调 试 选 项 (Debugging Option)
−a −dletters −fpretend−float −g −glevel −gcoff −gxcoff −gxcoff+ −gdwarf −gdwarf+ −gstabs −gstabs+ −ggdb −p −pg −save−temps −print−file−name=library −print−libgcc−file−name −print−prog−name=program
优 化 选 项 (Optimization Option)
−fcaller−saves −fcse−follow−jumps −fcse−skip−blocks −fdelayed−branch −felide−constructors −fexpensive−optimizations −ffast−math −ffloat−store −fforce−addr −fforce−mem −finline−functions −fkeep−inline−functions −fmemoize−lookups −fno−default−inline −fno−defer−pop −fno−function−cse −fno−inline −fno−peephole −fomit−frame−pointer −frerun−cse−after−loop −fschedule−insns −fschedule−insns2 −fstrength−reduce −fthread−jumps −funroll−all−loops −funroll−loops −O −O2 −O3
预 处 理 器 选 项 (Preprocessor Option)
−Aassertion −C −dD −dM −dN −Dmacro[=defn] −E −H −idirafter dir −include file −imacros file −iprefix file −iwithprefix dir −M −MD −MM −MMD −nostdinc −P −Umacro −undef
汇 编 器 选 项 (Assembler Option)
−Wa,option
连 接 器 选 项 (Linker Option)
−llibrary −nostartfiles −nostdlib −static −shared −symbolic −Xlinker option −Wl,option −u symbol
目 录 选 项 (Directory Option)
−Bprefix −Idir −I− −Ldir
目 标 机 选 项 (Target Option)
−b machine −V version
配 置 相 关 选 项 (Configuration Dependent Option)
M680x0 选
项
−m68000 −m68020 −m68020−40
−m68030 −m68040 −m68881 −mbitfield
−mc68000 −mc68020 −mfpa −mnobitfield
−mrtd −mshort −msoft−float
VAX 选
项
−mg −mgnu −munix
SPARC
选 项
−mepilogue −mfpu −mhard−float
−mno−fpu −mno−epilogue
−msoft−float −msparclite −mv8
−msupersparc −mcypress
Convex
选 项
−margcount −mc1 −mc2
−mnoargcount
AMD29K
选 项
−m29000 −m29050 −mbw −mdw
−mkernel−registers −mlarge −mnbw
−mnodw −msmall −mstack−check
−muser−registers
M88K
选 项
−m88000 −m88100 −m88110
−mbig−pic
−mcheck−zero−division
−mhandle−large−shift
−midentify−revision
−mno−check−zero−division
−mno−ocs−debug−info
−mno−ocs−frame−position
−mno−optimize−arg−area
−mno−serialize−volatile
−mno−underscores
−mocs−debug−info
−mocs−frame−position
−moptimize−arg−area
−mserialize−volatile
−mshort−data−num −msvr3
−msvr4 −mtrap−large−shift
−muse−div−instruction
−mversion−03.00
−mwarn−passed−structs
RS6000
选 项
−mfp−in−toc
−mno−fop−in−toc
RT 选
项
−mcall−lib−mul
−mfp−arg−in−fpregs
−mfp−arg−in−gregs
−mfull−fp−blocks
−mhc−struct−return
−min−line−mul
−mminimum−fp−blocks
−mnohc−struct−return
MIPS
选 项
−mcpu=cpu type −mips2 −mips3
−mint64 −mlong64 −mmips−as
−mgas −mrnames −mno−rnames
−mgpopt −mno−gpopt −mstats
−mno−stats −mmemcpy
−mno−memcpy −mno−mips−tfile
−mmips−tfile −msoft−float
−mhard−float −mabicalls
−mno−abicalls −mhalf−pic
−mno−half−pic −G num
−nocpp
i386
选 项
−m486 −mno−486 −msoft−float
−mno−fp−ret−in−387
HPPA
选 项
−mpa−risc−1−0
−mpa−risc−1−1 −mkernel
−mshared−libs −mno−shared−libs
−mlong−calls −mdisable−fpregs
−mdisable−indexing
−mtrailing−colon
i960
选 项
−mcpu-type −mnumerics
−msoft−float −mleaf−procedures
−mno−leaf−procedures
−mtail−call −mno−tail−call
−mcomplex−addr
−mno−complex−addr −mcode−align
−mno−code−align −mic−compat
−mic2.0−compat −mic3.0−compat
−masm−compat −mintel−asm
−mstrict−align
−mno−strict−align −mold−align
−mno−old−align
DEC Alpha
选 项
−mfp−regs −mno−fp−regs
−mno−soft−float
−msoft−float
System V
选 项
−G −Qy −Qn −YP,paths
−Ym,dir
代 码 生 成 选 项 (Code Generation Option)
−fcall−saved−reg −fcall−used−reg −ffixed−reg −finhibit−size−directive −fnonnull−objects −fno−common −fno−ident −fno−gnu−linker −fpcc−struct−return −fpic −fPIC −freg−struct−return −fshared−data −fshort−enums −fshort−double −fvolatile −fvolatile−global −fverbose−asm
总 体 选 项 (Overall Option)
−x language
明 确 指 出 后 面 输 入 文 件 的 语 言 为 language (而 不 是 从 文 件 名 后 缀 得 到 的 默 认 选 择 ). 这 个 选 项 应 用 于 后 面 所 有 的 输 入 文 件 , 直 到 遇 着 下 一 个 ’−x’ 选 项 . language 的 可 选 值 有 ’c’, ’objective−c’, ’c−header’, ’c++’, ’cpp−output’, ’assembler’, 和 ’assembler−with−cpp’.
−x none
关 闭 任 何 对 语 种 的 明 确 说 明 , 因 此 依 据 文 件 名 后 缀 处 理 后 面 的 文 件 (就 象 是 从 未 使 用 过 ’−x’ 选 项 ).
如 果 只 操 作 四 个 阶 段 (预 处 理 , 编 译 , 汇 编 , 连 接 ) 中 的 一 部 分 , 可 以 使 用 ’−x’ 选 项 (或 文 件 名 后 缀 ) 告 诉 gcc 从 哪 里 开 始 , 用 ’−c’, ’−S’, 或 ’−E’ 选 项 告 诉 gcc 到 哪 里 结 束 . 注 意 , 某 些 选 项 组 合 (例 如 , ’−x cpp−output −E’) 使 gcc 不 作 任 何 事 情 .
−c |
编 译 或 汇 编 源 文 件 , 但 是 不 作 连 接 . 编 译 器 输 出 对 应 于 源 文 件 的 目 标 文 件 . |
缺 省 情 况 下 , GCC 通 过 用 ’.o’ 替 换 源 文 件 名 后 缀 ’.c’, ’.i’, ’.s’, 等 等 , 产 生 目 标 文 件 名 . 可 以 使 用 −o 选 项 选 择 其 他 名 字 .
GCC 忽 略 −c 选 项 后 面 任 何 无 法 识 别 的 输 入 文 件 (他 们 不 需 要 编 译 或 汇 编 ).
−S |
编 译 后 即 停 止 , 不 进 行 汇 编 . 对 于 每 个 输 入 的 非 汇 编 语 言 文 件 , 输 出 文 件 是 汇 编 语 言 文 件 . |
缺 省 情 况 下 , GCC 通 过 用 ’.o’ 替 换 源 文 件 名 后 缀 ’.c’, ’.i’, 等 等 , 产 生 目 标 文 件 名 . 可 以 使 用 −o 选 项 选 择 其 他 名 字 .
GCC 忽 略 任 何 不 需 要 编 译 的 输 入 文 件 .
−E |
预 处 理 后 即 停 止 , 不 进 行 编 译 . 预 处 理 后 的 代 码 送 往 标 准 输 出 . |
GCC 忽 略 任 何 不 需 要 预 处 理 的 输 入 文 件 .
−o file
指 定 输 出 文 件 为 file. 该 选 项 不 在 乎 GCC 产 生 什 么 输 出 , 无 论 是 可 执 行 文 件 , 目 标 文 件 , 汇 编 文 件 还 是 预 处 理 后 的 C 代 码 .
由 于 只 能 指 定 一 个 输 出 文 件 , 因 此 编 译 多 个 输 入 文 件 时 , 使 用 ’−o’ 选 项 没 有 意 义 , 除 非 输 出 一 个 可 执 行 文 件 .
如 果 没 有 使 用 ’−o’ 选 项 , 默 认 的 输 出 结 果 是 : 可 执 行 文 件 为 ’a.out’, ’source.suffix’ 的 目 标 文 件 是 ’source.o’, 汇 编 文 件 是 ’source.s’, 而 预 处 理 后 的 C 源 代 码 送 往 标 准 输 出 .
−v |
(在 标 准 错 误 ) 显 示 执 行 编 译 阶 段 的 命 令 . 同 时 显 示 编 译 器 驱 动 程 序 , 预 处 理 器 , 编 译 器 的 版 本 号 . | ||
−pipe |
在 编 译 过 程 的 不 同 阶 段 间 使 用 管 道 而 非 临 时 文 件 进 行 通 信 . 这 个 选 项 在 某 些 系 统 上 无 法 工 作 , 因 为 那 些 系 统 的 汇 编 器 不 能 从 管 道 读 取 数 据 . GNU 的 汇 编 器 没 有 这 个 问 题 . |
语 言 选 项 (LANGUAGE OPTIONS)
下 列 选 项 控 制 编 译 器 能 够 接 受 的 C "方 言 ":
−ansi |
支 持 符 合 ANSI 标 准 的 C 程 序 . |
这 样 就 会 关 闭 GNU C 中 某 些 不 兼 容 ANSI C 的 特 性 , 例 如 asm, inline 和 typeof 关 键 字 , 以 及 诸 如 unix 和 vax 这 些 表 明 当 前 系 统 类 型 的 预 定 义 宏 . 同 时 开 启 不 受 欢 迎 和 极 少 使 用 的 ANSI trigraph 特 性 , 以 及 禁 止 ’$’ 成 为 标 识 符 的 一 部 分 .
尽 管 使 用 了 ’−ansi’ 选 项 , 下 面 这 些 可 选 的 关 键 字 , __asm__, __extension__, __inline__ 和 __typeof__ 仍 然 有 效 . 你 当 然 不 会 把 他 们 用 在 ANSI C 程 序 中 , 但 可 以 把 他 们 放 在 头 文 件 里 , 因 为 编 译 包 含 这 些 头 文 件 的 程 序 时 , 可 能 会 指 定 ’−ansi’ 选 项 . 另 外 一 些 预 定 义 宏 , 如 __unix__ 和 __vax__, 无 论 有 没 有 使 用 ’−ansi’ 选 项 , 始 终 有 效 .
使 用 ’−ansi’ 选 项 不 会 自 动 拒 绝 编 译 非 ANSI程 序 , 除 非 增 加 ’−pedantic’ 选 项 作 为 ’−ansi’ 选 项 的 补 充 .
使 用 ’−ansi’ 选 项 的 时 候 , 预 处 理 器 会 预 定 义 一 个 __STRICT_ANSI__ 宏 . 有 些 头 文 件 关 注 此 宏 , 以 避 免 声 明 某 些 函 数 , 或 者 避 免 定 义 某 些 宏 , 这 些 函 数 和 宏 不 被 ANSI 标 准 调 用 ; 这 样 就 不 会 干 扰 在 其 他 地 方 使 用 这 些 名 字 的 程 序 了 .
−fno−asm
不 把 asm, inline 或 typeof 当 作 关 键 字 , 因 此 这 些 词 可 以 用 做 标 识 符 . 用 __asm__, __inline__ 和 __typeof__ 能 够 替 代 他 们 . ’−ansi’ 隐 含 声 明 了 ’−fno−asm’.
−fno−builtin
不 接 受 不 是 两 个 下 划 线 开 头 的 内 建 函 数 (built-in function). 目 前 受 影 响 的 函 数 有 _exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy, 和 strlen.
’−ansi’ 选 项 能 够 阻 止 alloca 和 _exit 成 为 内 建 函 数 .
−fhosted
按 宿 主 环 境 编 译 ; 他 隐 含 声 明 了 ’−fbuiltin’ 选 项 , 而 且 警 告 不 正 确 的 main 函 数 声 明 .
−ffreestanding
按 独 立 环 境 编 译 ; 他 隐 含 声 明 了 ’−fno-builtin’ 选 项 , 而 且 对 main 函 数 没 有 特 别 要 求 .
(译 注 : 宿 主 环 境 (hosted environment) 下 所 有 的 标 准 库 可 用 , main 函 数 返 回 一 个 int 值 , 典 型 例 子 是 除 了 内 核 以 外 几 乎 所 有 的 程 序 . 对 应 的 独 立 环 境 (freestanding environment) 不 存 在 标 准 库 , 程 序 入 口 也 不 一 定 是 main, 最 明 显 的 例 子 就 是 操 作 系 统 内 核 . 详 情 参 考 gcc 网 站 最 近 的 资 料 )
−fno−strict−prototype
对 于 没 有 参 数 的 函 数 声 明 , 例 如 ’int foo ();’, 按 C 风 格 处 理 —即 不 说 明 参 数 个 数 或 类 型 . (仅 针 对 C++). 正 常 情 况 下 , 这 样 的 函 数 foo 在 C++ 中 意 味 着 参 数 为 空 .
−trigraphs
支 持 ANSI C trigraphs. ’−ansi’ 选 项 隐 含 声 明 了 ’−trigraphs’.
−traditional
试 图 支 持 传 统 C 编 译 器 的 某 些 方 面 . 详 见 GNU C 手 册 , 我 们 已 经 把 细 节 清 单 从 这 里 删 除 , 这 样 当 内 容 过 时 后 , 人 们 也 不 会 埋 怨 我 们 .
除 了 一 件 事 : 对 于 C++ 程 序 (不 是 C), ’−traditional’ 选 项 带 来 一 个 附 加 效 应 , 允 许 对 this 赋 值 . 他 和 ’−fthis−is−variable’ 选 项 的 效 果 一 样 .
−traditional−cpp
试 图 支 持 传 统 C 预 处 理 器 的 某 些 方 面 . 特 别 是 上 面 提 到 有 关 预 处 理 器 的 内 容 , 但 是 不 包 括 ’−traditional’ 选 项 的 其 他 效 应 .
−fdollars−in−identifiers
允 许 在 标 识 符 (identifier) 中 使 用 ’$’ 字 符 (仅 针 对 C++). 你 可 以 指 定 ’−fno−dollars−in−identifiers’ 选 项 显 明 禁 止 使 用 ’$’ 符 . (GNU C++ 在 某 些 目 标 系 统 缺 省 允 许 ’$’ 符 , 但 不 是 所 有 系 统 .)
−fenum−int−equiv
允 许 int 类 型 到 枚 举 类 型 (enumeration) 的 隐 式 转 换 (仅 限 于 C++). 正 常 情 况 下 GNU C++ 允 许 从 enum 到 int 的 转 换 , 反 之 则 不 行 .
−fexternal−templates
为 模 板 声 明 (template declaration) 产 生 较 小 的 代 码 (仅 限 于 C++), 方 法 是 对 于 每 个 模 板 函 数 (template function), 只 在 定 义 他 们 的 地 方 生 成 一 个 副 本 . 想 要 成 功 使 用 这 个 选 项 , 你 必 须 在 所 有 使 用 模 板 的 文 件 中 , 标 记 ’#pragma implementation’ (定 义 ) 或 ’#pragma interface’ (声 明 ).
当 程 序 用 ’−fexternal−templates’ 编 译 时 , 模 板 实 例 (template instantiation) 全 部 是 外 部 类 型 . 你 必 须 让 需 要 的 实 例 在 实 现 文 件 中 出 现 . 可 以 通 过 typedef 实 现 这 一 点 , 他 引 用 所 需 的 每 个 实 例 . 相 对 应 的 , 如 果 编 译 时 使 用 缺 省 选 项 ’−fno−external−templates’, 所 有 模 板 实 例 明 确 的 设 为 内 置 .
−fall−virtual
所 有 可 能 的 成 员 函 数 默 认 为 虚 函 数 . 所 有 的 成 员 函 数 (除 了 构 造 子 函 数 和 new 或 delete 成 员 操 作 符 ) 视 为 所 在 类 的 虚 函 数 .
这 不 表 明 每 次 调 用 成 员 函 数 都 将 通 过 内 部 虚 函 数 表 . 有 些 情 况 下 , 编 译 器 能 够 判 断 出 可 以 直 接 调 用 某 个 虚 函 数 ; 这 时 就 直 接 调 用 .
−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 char 或 unsigned char. 但 是 许 多 程 序 已 经 写 成 只 用 简 单 的 char, 并 且 期 待 这 是 有 符 号 数 (或 者 无 符 号 数 , 具 体 情 况 取 决 于 编 写 程 序 的 目 标 机 器 ). 这 个 选 项 , 和 它 的 反 义 选 项 , 使 那 样 的 程 序 工 作 在 对 应 的 默 认 值 上 .
char 的 类 型 始 终 应 该 明 确 定 义 为 signed char 或 unsigned 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
把 目 录 添 加 到 第 二 包 含 路 径 中 . 目 录 名 由 prefix 和 dir 合 并 而 成 , 这 里 prefix 被 先 前 的 ’−iprefix’ 选 项 指 定 .
−nostdinc
不 要 在 标 准 系 统 目 录 中 寻 找 头 文 件 . 只 搜 索 ’−I’ 选 项 指 定 的 目 录 (以 及 当 前 目 录 , 如 果 合 适 ).
结 合 使 用 ’−nostdinc’ 和 ’−I−’ 选 项 , 你 可 以 把 包 含 文 件 搜 索 限 制 在 显 式 指 定 的 目 录 .
−nostdinc++
不 要 在 C++ 专 用 标 准 目 录 中 寻 找 头 文 件 , 但 是 仍 然 搜 索 其 他 标 准 目 录 . (当 建 立 ’libg++’ 时 使 用 这 个 选 项 .)
−undef |
不 要 预 定 义 任 何 非 标 准 宏 . (包 括 系 统 结 构 标 志 ). | ||
−E |
仅 运 行 C 预 处 理 器 . 预 处 理 所 有 指 定 的 C 源 文 件 , 结 果 送 往 标 准 输 出 或 指 定 的 输 出 文 件 . | ||
−C |
告 诉 预 处 理 器 不 要 丢 弃 注 释 . 配 合 ’−E’ 选 项 使 用 . | ||
−P |
告 诉 预 处 理 器 不 要 产 生 ’#line’ 命 令 . 配 合 ’−E’ 选 项 使 用 . |
−M [ −MG ]
告 诉 预 处 理 器 输 出 一 个 适 合 make 的 规 则 , 用 于 描 述 各 目 标 文 件 的 依 赖 关 系 . 对 于 每 个 源 文 件 , 预 处 理 器 输 出 一 个 make 规 则 , 该 规 则 的 目 标 项 (target) 是 源 文 件 对 应 的 目 标 文 件 名 , 依 赖 项 (dependency) 是 源 文 件 中 ’#include 引 用 的 所 有 文 件 . 生 成 的 规 则 可 以 是 单 行 , 但 如 果 太 长 , 就 用 ’\’-换 行 符 续 成 多 行 . 规 则 显 示 在 标 准 输 出 , 不 产 生 预 处 理 过 的 C 程 序 .
’−M’ 隐 含 了 ’−E’ 选 项 .
’−MG’ 要 求 把 缺 失 的 头 文 件 按 存 在 对 待 , 并 且 假 定 他 们 和 源 程 序 文 件 在 同 一 目 录 下 . 必 须 和 ’−M’ 选 项 一 起 用 .
−MM [ −MG ]
和 ’−M’ 选 项 类 似 , 但 是 输 出 结 果 仅 涉 及 用 户 头 文 件 , 象 这 样 ’#include "file"’. 忽 略 系 统 头 文 件 如 ’#include <file>’.
−MD |
和 ’−M’ 选 项 类 似 , 但 是 把 依 赖 信 息 输 出 在 文 件 中 , 文 件 名 通 过 把 输 出 文 件 名 末 尾 的 ’.o’ 替 换 为 ’.d’ 产 生 . 同 时 继 续 指 定 的 编 译 工 作 —’−MD’ 不 象 ’−M’ 那 样 阻 止 正 常 的 编 译 任 务 . |
Mach 的 实 用 工 具 ’md’ 能 够 合 并 ’.d’ 文 件 , 产 生 适 用 于 ’make’ 命 令 的 单 一 的 依 赖 文 件 .
−MMD |
和 ’−MD’ 选 项 类 似 , 但 是 输 出 结 果 仅 涉 及 用 户 头 文 件 , 忽 略 系 统 头 文 件 . | ||
−H |
除 了 其 他 普 通 的 操 作 , GCC 显 示 引 用 过 的 头 文 件 名 . |
−Aquestion(answer)
如 果 预 处 理 器 做 条 件 测 试 , 如 ’#if #question(answer)’, 该 选 项 可 以 断 言 (Assert) question 的 答 案 是 answer. −A−’ 关 闭 一 般 用 于 描 述 目 标 机 的 标 准 断 言 .
−Dmacro
定 义 宏 macro, 宏 的 内 容 定 义 为 字 符 串 ’1’.
−Dmacro=defn
定 义 宏 macro 的 内 容 为 defn. 命 令 行 上 所 有 的 ’−D’ 选 项 在 ’−U’ 选 项 之 前 处 理 .
−Umacro
取 消 宏 macro. ’−U’ 选 项 在 所 有 的 ’−D’ 选 项 之 后 处 理 , 但 是 优 先 于 任 何 ’−include’ 或 ’−imacros’ 选 项 .
−dM |
告 诉 预 处 理 器 输 出 有 效 的 宏 定 义 列 表 (预 处 理 结 束 时 仍 然 有 效 的 宏 定 义 ). 该 选 项 需 结 合 ’−E’ 选 项 使 用 . | ||
−dD |
告 诉 预 处 理 器 把 所 有 的 宏 定 义 传 递 到 输 出 端 , 按 照 出 现 的 顺 序 显 示 . | ||
−dN |
和 ’−dD’选 项 类 似 , 但 是 忽 略 宏 的 参 量 或 内 容 . 只 在 输 出 端 显 示 ’#define name |
汇 编 器 选 项 (ASSEMBLER OPTION)
−Wa,option
把 选 项 option 传 递 给 汇 编 器 . 如 果 option 含 有 逗 号 , 就 在 逗 号 处 分 割 成 多 个 选 项 .
连 接 器 选 项 (LINKER OPTION)
下
面 的 选 项 用 于
编 译 器 连 接 目
标 文 件 , 输 出 可
执 行 文 件 的 时
候 . 如 果 编 译 器
不 进 行 连 接 , 他
们 就 毫 无 意 义 .
object-file-name
如 果 某 些 文 件 没 有 特 别 明 确 的 后 缀 a special recognized suffix, GCC 就 认 为 他 们 是 目 标 文 件 或 库 文 件 . (根 据 文 件 内 容 , 连 接 器 能 够 区 分 目 标 文 件 和 库 文 件 ). 如 果 GCC 执 行 连 接 操 作 , 这 些 目 标 文 件 将 成 为 连 接 器 的 输 入 文 件 .
−llibrary
连 接 名 为 library 的 库 文 件 .
连 接 器 在 标 准 搜 索 目 录 中 寻 找 这 个 库 文 件 , 库 文 件 的 真 正 名 字 是 ’liblibrary.a’. 连 接 器 会 当 做 文 件 名 得 到 准 确 说 明 一 样 引 用 这 个 文 件 .
搜 索 目 录 除 了 一 些 系 统 标 准 目 录 外 , 还 包 括 用 户 以 ’−L’ 选 项 指 定 的 路 径 .
一 般 说 来 用 这 个 方 法 找 到 的 文 件 是 库 文 件 —即 由 目 标 文 件 组 成 的 归 档 文 件 (archive file). 连 接 器 处 理 归 档 文 件 的 方 法 是 : 扫 描 归 档 文 件 , 寻 找 某 些 成 员 , 这 些 成 员 的 符 号 目 前 已 被 引 用 , 不 过 还 没 有 被 定 义 . 但 是 , 如 果 连 接 器 找 到 普 通 的 目 标 文 件 , 而 不 是 库 文 件 , 就 把 这 个 目 标 文 件 按 平 常 方 式 连 接 进 来 . 指 定 ’−l’ 选 项 和 指 定 文 件 名 的 唯 一 区 别 是 , ’−l选 项 用 ’lib’ 和 ’.a’ 把 library 包 裹 起 来 , 而 且 搜 索 一 些 目 录 .
−lobjc |
这 个 −l 选 项 的 特 殊 形 式 用 于 连 接 Objective C 程 序 . |
−nostartfiles
不 连 接 系 统 标 准 启 动 文 件 , 而 标 准 库 文 件 仍 然 正 常 使 用 .
−nostdlib
不 连 接 系 统 标 准 启 动 文 件 和 标 准 库 文 件 . 只 把 指 定 的 文 件 传 递 给 连 接 器 .
−static
在 支 持 动 态 连 接 (dynamic linking) 的 系 统 上 , 阻 止 连 接 共 享 库 . 该 选 项 在 其 他 系 统 上 无 效 .
−shared
生 成 一 个 共 享 目 标 文 件 , 他 可 以 和 其 他 目 标 文 件 连 接 产 生 可 执 行 文 件 . 只 有 部 分 系 统 支 持 该 选 项 .
−symbolic
建 立 共 享 目 标 文 件 的 时 候 , 把 引 用 绑 定 到 全 局 符 号 上 . 对 所 有 无 法 解 析 的 引 用 作 出 警 告 (除 非 用 连 接 编 辑 选 项 ’−Xlinker −z −Xlinker defs’ 取 代 ). 只 有 部 分 系 统 支 持 该 选 项 .
−Xlinker option
把 选 项 option 传 递 给 连 接 器 . 可 以 用 他 传 递 系 统 特 定 的 连 接 选 项 , GNU CC 无 法 识 别 这 些 选 项 .
如 果 需 要 传 递 携 带 参 数 的 选 项 , 你 必 须 使 用 两 次 ’−Xlinker’, 一 次 传 递 选 项 , 另 一 次 传 递 他 的 参 数 . 例 如 , 如 果 传 递 ’−assert definitions’, 你 必 须 写 成 ’−Xlinker −assert −Xlinker definitions’, 而 不 能 写 成 ’−Xlinker "−assert definitions"’, 因 为 这 样 会 把 整 个 字 符 串 当 做 一 个 参 数 传 递 , 显 然 这 不 是 连 接 器 期 待 的 .
−Wl,option
把 选 项 option 传 递 给 连 接 器 . 如 果 option 中 含 有 逗 号 , 就 在 逗 号 处 分 割 成 多 个 选 项 .
−u symbol
使 连 接 器 认 为 取 消 了 symbol 的 符 号 定 义 , 从 而 连 接 库 模 块 以 取 得 定 义 . 你 可 以 使 用 多 个 ’−u’ 选 项 , 各 自 跟 上 不 同 的 符 号 , 使 得 连 接 器 调 入 附 加 的 库 模 块 .
目 录 选 项 (DIRECTORY OPTION)
下 列 选 项 指 定 搜 索 路 径 , 用 于 查 找 头 文 件 , 库 文 件 , 或 编 译 器 的 某 些 成 员 :
−Idir |
在 头 文 件 的 搜 索 路 径 列 表 中 添 加 dir 目 录 . | ||
−I− |
任 何 在 ’−I−’ 前 面 用 ’−I’ 选 项 指 定 的 搜 索 路 径 只 适 用 于 ’#include "file"’ 这 种 情 况 ; 他 们 不 能 用 来 搜 索 ’#include <file>’ 包 含 的 头 文 件 . |
如 果 用 ’−I’ 选 项 指 定 的 搜 索 路 径 位 于 ’−I−’ 选 项 后 面 , 就 可 以 在 这 些 路 径 中 搜 索 所 有 的 ’#include’ 指 令 . (一 般 说 来 −I 选 项 就 是 这 么 用 的 .)
还 有 , ’−I−’ 选 项 能 够 阻 止 当 前 目 录 (存 放 当 前 输 入 文 件 的 地 方 ) 成 为 搜 索 ’#include "file"’ 的 第 一 选 择 . 没 有 办 法 克 服 ’−I−’ 选 项 的 这 个 效 应 . 你 可 以 指 定 ’−I.’ 搜 索 那 个 目 录 , 它 在 调 用 编 译 器 时 是 当 前 目 录 . 这 和 预 处 理 器 的 默 认 行 为 不 完 全 一 样 , 但 是 结 果 通 常 令 人 满 意 .
’−I−’ 不 影 响 使 用 系 统 标 准 目 录 , 因 此 , ’−I−’ 和 ’−nostdinc’ 是 不 同 的 选 项 .
−Ldir |
在 ’−l’ 选 项 的 搜 索 路 径 列 表 中 添 加 dir 目 录 . |
−Bprefix
这 个 选 项 指 出 在 何 处 寻 找 可 执 行 文 件 , 库 文 件 , 以 及 编 译 器 自 己 的 数 据 文 件 .
编 译 器 驱 动 程 序 需 要 执 行 某 些 下 面 的 子 程 序 : ’cpp’, ’cc1’ (或 C++ 的 ’cc1plus’), ’as’ 和 ’ld’. 他 把 prefix 当 作 欲 执 行 的 程 序 的 前 缀 , 既 可 以 包 括 也 可 以 不 包 括 ’machine/version/’.
对 于 要 运 行 的 子 程 序 , 编 译 器 驱 动 程 序 首 先 试 着 加 上 ’−B’ 前 缀 (如 果 存 在 ). 如 果 没 有 找 到 文 件 , 或 没 有 指 定 ’−B’ 选 项 , 编 译 器 接 着 会 试 验 两 个 标 准 前 缀 ’/usr/lib/gcc/’ 和 ’/usr/local/lib/gcc-lib/’. 如 果 仍 然 没 能 够 找 到 所 需 文 件 , 编 译 器 就 在 ’PATH’ 环 境 变 量 指 定 的 路 径 中 寻 找 没 加 任 何 前 缀 的 文 件 名 .
如 果 有 需 要 , 运 行 时 (run-time) 支 持 文 件 ’libgcc.a’ 也 在 ’−B’ 前 缀 的 搜 索 范 围 之 内 . 如 果 这 里 没 有 找 到 , 就 在 上 面 提 到 的 两 个 标 准 前 缀 中 寻 找 , 仅 此 而 已 . 如 果 上 述 方 法 没 有 找 到 这 个 文 件 , 就 不 连 接 他 了 . 多 数 情 况 的 多 数 机 器 上 , ’libgcc.a’ 并 非 必 不 可 少 .
你 可 以 通 过 环 境 变 量 GCC_EXEC_PREFIX 获 得 近 似 的 效 果 ; 如 果 定 义 了 这 个 变 量 , 其 值 就 和 上 面 说 的 一 样 用 做 前 缀 . 如 果 同 时 指 定 了 ’−B’ 选 项 和 GCC_EXEC_PREFIX 变 量 , 编 译 器 首 先 使 用 ’−B’ 选 项 , 然 后 才 尝 试 环 境 变 量 值 .
警 告 选 项 (WARNING OPTION)
警 告 是 针 对 程 序 结 构 的 诊 断 信 息 , 程 序 不 一 定 有 错 误 , 而 是 存 在 风 险 , 或 者 可 能 存 在 错 误 .
下
列 选 项 控 制 GNU CC 产
生 的 警 告 的 数
量 和 类 型 :
−fsyntax−only
检 查 程 序 中 的 语 法 错 误 , 但 是 不 产 生 输 出 信 息 .
−w |
禁 止 所 有 警 告 信 息 . |
−Wno−import
禁 止 所 有 关 于 #import 的 警 告 信 息 .
−pedantic
打 开 完 全 服 从 ANSI C 标 准 所 需 的 全 部 警 告 诊 断 ; 拒 绝 接 受 采 用 了 被 禁 止 的 语 法 扩 展 的 程 序 .
无 论 有 没 有 这 个 选 项 , 符 合 ANSI C 标 准 的 程 序 应 该 能 够 被 正 确 编 译 (虽 然 极 少 数 程 序 需 要 ’−ansi’ 选 项 ). 然 而 , 如 果 没 有 这 个 选 项 , 某 些 GNU 扩 展 和 传 统 C 特 性 也 得 到 支 持 . 使 用 这 个 选 项 可 以 拒 绝 这 些 程 序 . 没 有 理 由 使 用 这 个 选 项 , 他 存 在 只 是 为 了 满 足 一 些 书 呆 子 (pedant).
对 于 替 选 关 键 字 (他 们 以 ’__’ 开 始 和 结 束 ) ’−pedantic’ 不 会 产 生 警 告 信 息 . Pedantic 也 不 警 告 跟 在 __extension__ 后 面 的 表 达 式 . 不 过 只 应 该 在 系 统 头 文 件 中 使 用 这 种 转 义 措 施 , 应 用 程 序 最 好 避 免 .
−pedantic−errors
该 选 项 和 ’−pedantic’ 类 似 , 但 是 显 示 错 误 而 不 是 警 告 .
−W |
对 下 列 事 件 显 示 额 外 的 警 告 信 息 : | ||
• |
非 易 变 自 动 变 量 (nonvolatile automatic variable) 可 能 在 调 用 longjmp 时 发 生 改 变 . 这 些 警 告 仅 在 优 化 编 译 时 发 生 . |
编 译 器 只 知 道 对 setjmp 的 调 用 , 他 不 可 能 知 道 会 在 哪 里 调 用 longjmp, 事 实 上 一 个 信 号 处 理 例 程 可 以 在 程 序 的 任 何 地 点 调 用 他 . 其 结 果 是 , 即 使 程 序 没 有 问 题 , 你 也 可 能 会 得 到 警 告 , 因 为 无 法 在 可 能 出 现 问 题 的 地 方 调 用 longjmp.
• |
既 可 以 返 回 值 , 也 可 以 不 返 回 值 的 函 数 . (缺 少 结 尾 的 函 数 体 被 看 作 不 返 回 函 数 值 ) 例 如 , 下 面 的 函 数 将 导 致 这 种 警 告 : |
foo (a)
{
if (a > 0)
return a;
}
由 于 GNU CC 不 知 道 某 些 函 数 永 不 返 回 (含 有 abort 和 longjmp), 因 此 有 可 能 出 现 虚 假 警 告 .
• |
表 达 式 语 句 或 逗 号 表 达 式 的 左 侧 没 有 产 生 作 用 (side effect). 如 果 要 防 止 这 种 警 告 , 应 该 把 未 使 用 的 表 达 式 强 制 转 换 为 void 类 型 . 例 如 , 这 样 的 表 达 式 ’x[i,j]’ 会 导 致 警 告 , 而 ’x[(void)i,j]’ 就 不 会 . | ||
• |
无 符 号 数 用 ’>’ 或 ’<=’ 和 零 做 比 较 . |
−Wimplicit-int
警 告 没 有 指 定 类 型 的 声 明 .
−Wimplicit-function-declaration
警 告 在 声 明 之 前 就 使 用 的 函 数 .
−Wimplicit
同 -Wimplicit-int 和 -Wimplicit-function-declaration.
−Wmain |
如 果 把 main 函 数 声 明 或 定 义 成 奇 怪 的 类 型 , 编 译 器 就 发 出 警 告 . 典 型 情 况 下 , 这 个 函 数 用 于 外 部 连 接 , 返 回 int 数 值 , 不 需 要 参 数 , 或 指 定 两 个 参 数 . |
−Wreturn−type
如 果 函 数 定 义 了 返 回 类 型 , 而 默 认 类 型 是 int 型 , 编 译 器 就 发 出 警 告 . 同 时 警 告 那 些 不 带 返 回 值 的 return 语 句 , 如 果 他 们 所 属 的 函 数 并 非 void 类 型 .
−Wunused
如 果 某 个 局 部 变 量 除 了 声 明 就 没 再 使 用 , 或 者 声 明 了 静 态 函 数 但 是 没 有 定 义 , 或 者 某 条 语 句 的 运 算 结 果 显 然 没 有 使 用 , 编 译 器 就 发 出 警 告 .
−Wswitch
如 果 某 条 switch 语 句 的 参 数 属 于 枚 举 类 型 , 但 是 没 有 对 应 的 case 语 句 使 用 枚 举 元 素 , 编 译 器 就 发 出 警 告 . ( default 语 句 的 出 现 能 够 防 止 这 个 警 告 .) 超 出 枚 举 范 围 的 case 语 句 同 样 会 导 致 这 个 警 告 .
−Wcomment
如 果 注 释 起 始 序 列 ’/∗’ 出 现 在 注 释 中 , 编 译 器 就 发 出 警 告 .
−Wtrigraphs
警 告 任 何 出 现 的 trigraph (假 设 允 许 使 用 他 们 ).
−Wformat
检 查 对 printf 和 scanf 等 函 数 的 调 用 , 确 认 各 个 参 数 类 型 和 格 式 串 中 的 一 致 .
−Wchar−subscripts
警 告 类 型 是 char 的 数 组 下 标 . 这 是 常 见 错 误 , 程 序 员 经 常 忘 记 在 某 些 机 器 上 char 有 符 号 .
−Wuninitialized
在 初 始 化 之 前 就 使 用 自 动 变 量 .
这 些 警 告 只 可 能 做 优 化 编 译 时 出 现 , 因 为 他 们 需 要 数 据 流 信 息 , 只 有 做 优 化 的 时 候 才 估 算 数 据 流 信 息 . 如 果 不 指 定 ’−O’ 选 项 , 就 不 会 出 现 这 些 警 告 .
这 些 警 告 仅 针 对 等 候 分 配 寄 存 器 的 变 量 . 因 此 不 会 发 生 在 声 明 为 volatile 的 变 量 上 面 , 不 会 发 生 在 已 经 取 得 地 址 的 变 量 , 或 长 度 不 等 于 1, 2, 4, 8 字 节 的 变 量 . 同 样 也 不 会 发 生 在 结 构 , 联 合 或 数 组 上 面 , 即 使 他 们 在 寄 存 器 中 .
注 意 , 如 果 某 个 变 量 只 计 算 了 一 个 从 未 使 用 过 的 值 , 这 里 可 能 不 会 警 告 . 因 为 在 显 示 警 告 之 前 , 这 样 的 计 算 已 经 被 数 据 流 分 析 删 除 了 .
这 些 警 告 作 为 可 选 项 是 因 为 GNU CC 还 没 有 智 能 到 判 别 所 有 的 情 况 , 知 道 有 些 看 上 去 错 误 的 代 码 其 实 是 正 确 的 . 下 面 是 一 个 这 样 的 例 子 :
{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
如 果 y 始 终 是 1, 2 或 3, 那 么 x 总 会 被 初 始 化 , 但 是 GNU CC 不 知 道 这 一 点 . 下 面 是 另 一 个 普 遍 案 例 :
{
int save_y;
if (change_y) save_y = y, y = new_y;
...
if (change_y) y = save_y;
}
这 里 没 有 错 误 , 因 为 只 有 设 置 了 save_y 才 使 用 他 .
把 所 有 不 返 回 的 函 数 定 义 为 volatile 可 以 避 免 某 些 似 是 而 非 的 警 告 .
−Wparentheses
在 某 些 情 况 下 如 果 忽 略 了 括 号 , 编 译 器 就 发 出 警 告 .
−Wtemplate−debugging
当 在 C++ 程 序 中 使 用 template 的 时 候 , 如 果 调 试 (debugging) 没 有 完 全 生 效 , 编 译 器 就 发 出 警 告 . (仅 用 于 C++).
−Wall |
结 合 所 有 上 述 的 ’−W’ 选 项 . 通 常 我 们 建 议 避 免 这 些 被 警 告 的 用 法 , 我 们 相 信 , 恰 当 结 合 宏 的 使 用 能 够 轻 易 避 免 这 些 用 法 。 |
剩
下 的 ’−W...’ 选
项 不 包 括 在
’−Wall’ 中 , 因
为 我 们 认 为 在
必 要 情 况 下 , 这
些 被 编 译 器 警
告 的 程 序 结 构 ,
可 以 合 理 的 用
在 "干 净 的 " 程
序 中 .
−Wtraditional
如 果 某 些 程 序 结 构 在 传 统 C 中 的 表 现 和 ANSI C 不 同 , 编 译 器 就 发 出 警 告 .
• |
宏 参 出 现 在 宏 体 的 字 符 串 常 量 内 部 . 传 统 C 会 替 换 宏 参 , 而 ANSI C 则 视 其 为 常 量 的 一 部 分 . | ||
• |
某 个 函 数 在 块 (block) 中 声 明 为 外 部 , 但 在 块 结 束 后 才 调 用 . | ||
• |
switch 语 句 的 操 作 数 类 型 是 long. |
−Wshadow
一 旦 某 个 局 部 变 量 屏 蔽 了 另 一 个 局 部 变 量 , 编 译 器 就 发 出 警 告 .
−Wid−clash−len
一 旦 两 个 确 定 的 标 识 符 具 有 相 同 的 前 len 个 字 符 , 编 译 器 就 发 出 警 告 . 他 可 以 协 助 你 开 发 一 些 将 要 在 某 些 过 时 的 , 危 害 大 脑 的 编 译 器 上 编 译 的 程 序 .
−Wpointer−arith
任 何 语 句 如 果 依 赖 于 函 数 类 型 的 大 小 (size) 或 者 void 类 型 的 大 小 , 编 译 器 就 发 出 警 告 . GNU C 为 了 便 于 计 算 void ∗ 指 针 和 函 数 指 针 , 就 把 这 些 类 型 的 大 小 定 义 为 1.
−Wcast−qual
一 旦 某 个 指 针 强 制 类 型 转 换 以 便 移 除 类 型 修 饰 符 时 , 编 译 器 就 发 出 警 告 . 例 如 , 如 果 把 const char ∗ 强 制 转 换 为 普 通 的 char ∗ 时 , 警 告 就 会 出 现 .
−Wcast−align
一 旦 某 个 指 针 类 型 强 制 转 换 时 , 导 致 目 标 所 需 的 地 址 对 齐 (alignment) 增 加 , 编 译 器 就 发 出 警 告 . 例 如 , 某 些 机 器 上 只 能 在 2 或 4 字 节 边 界 上 访 问 整 数 , 如 果 在 这 种 机 型 上 把 char ∗ 强 制 转 换 成 int ∗ 类 型 , 编 译 器 就 发 出 警 告 .
−Wwrite−strings
规 定 字 符 串 常 量 的 类 型 是 const char[length], 因 此 , 把 这 样 的 地 址 复 制 给 non-const char ∗ 指 针 将 产 生 警 告 . 这 些 警 告 能 够 帮 助 你 在 编 译 期 间 发 现 企 图 写 入 字 符 串 常 量 的 代 码 , 但 是 你 必 须 非 常 仔 细 的 在 声 明 和 原 形 中 使 用 const, 否 则 他 们 只 能 带 来 麻 烦 ; 所 以 我 们 没 有 让 ’−Wall’ 提 供 这 些 警 告 .
−Wconversion
如 果 某 函 数 原 形 导 致 的 类 型 转 换 和 无 函 数 原 形 时 的 类 型 转 换 不 同 , 编 译 器 就 发 出 警 告 . 这 里 包 括 定 点 数 和 浮 点 数 的 互 相 转 换 , 改 变 定 点 数 的 宽 度 或 符 号 , 除 非 他 们 和 缺 省 声 明 (default promotion) 相 同 .
−Waggregate−return
如 果 定 义 或 调 用 了 返 回 结 构 或 联 合 的 函 数 , 编 译 器 就 发 出 警 告 . (从 语 言 角 度 你 可 以 返 回 一 个 数 组 , 然 而 同 样 会 导 致 警 告 .)
−Wstrict−prototypes
如 果 函 数 的 声 明 或 定 义 没 有 指 出 参 数 类 型 , 编 译 器 就 发 出 警 告 . (如 果 函 数 的 前 向 引 用 说 明 指 出 了 参 数 类 型 , 则 允 许 后 面 使 用 旧 式 风 格 的 函 数 定 义 , 而 不 会 产 生 警 告 .)
−Wmissing−prototypes
如 果 没 有 预 先 声 明 函 数 原 形 就 定 义 了 全 局 函 数 , 编 译 器 就 发 出 警 告 . 即 使 函 数 定 义 自 身 提 供 了 函 数 原 形 也 会 产 生 这 个 警 告 . 他 的 目 的 是 检 查 没 有 在 头 文 件 中 声 明 的 全 局 函 数 .
−Wmissing−declarations
如 果 没 有 预 先 声 明 就 定 义 了 全 局 函 数 , 编 译 器 就 发 出 警 告 . 即 使 函 数 定 义 自 身 提 供 了 函 数 原 形 也 会 产 生 这 个 警 告 . 这 个 选 项 的 目 的 是 检 查 没 有 在 头 文 件 中 声 明 的 全 局 函 数 .
−Wredundant-decls
如 果 在 同 一 个 可 见 域 某 定 义 多 次 声 明 , 编 译 器 就 发 出 警 告 , 即 使 这 些 重 复 声 明 有 效 并 且 毫 无 差 别 .
−Wnested-externs
如 果 某 extern 声 明 出 现 在 函 数 内 部 , 编 译 器 就 发 出 警 告 .
−Wenum−clash
对 于 不 同 枚 举 类 型 之 间 的 转 换 发 出 警 告 (仅 适 用 于 C++).
−Wlong−long
如 果 使 用 了 long long 类 型 就 发 出 警 告 . 该 警 告 是 缺 省 项 . 使 用 ’−Wno−long−long’ 选 项 能 够 防 止 这 个 警 告 . ’−Wlong−long’ 和 ’−Wno−long−long’ 仅 在 ’−pedantic’ 之 下 才 起 作 用 .
−Woverloaded−virtual
(仅 适 用 于 C++.) 在 继 承 类 中 , 虚 函 数 的 定 义 必 须 匹 配 虚 函 数 在 基 类 中 声 明 的 类 型 特 征 (type signature). 当 继 承 类 声 明 了 某 个 函 数 , 它 可 能 是 个 错 误 的 尝 试 企 图 定 义 一 个 虚 函 数 , 使 用 这 个 选 项 能 够 产 生 警 告 : 就 是 说 , 当 某 个 函 数 和 基 类 中 的 虚 函 数 同 名 , 但 是 类 型 特 征 不 符 合 基 类 的 任 何 虚 函 数 , 编 译 器 将 发 出 警 告 .
−Winline
如 果 某 函 数 不 能 内 嵌 (inline), 无 论 是 声 明 为 inline 或 者 是 指 定 了 −finline−functions 选 项 , 编 译 器 都 将 发 出 警 告 .
−Werror
视 警 告 为 错 误 ; 出 现 任 何 警 告 即 放 弃 编 译 .
调 试 选 项 (DEBUGGING OPTION)
GNU CC 拥 有 许 多 特 别 选 项 , 既 可 以 调 试 用 户 的 程 序 , 也 可 以 对 GCC 排 错 :
−g |
以 操 作 系 统 的 本 地 格 式 (stabs, COFF, XCOFF, 或 DWARF). 产 生 调 试 信 息 . GDB 能 够 使 用 这 些 调 试 信 息 . |
在 大 多 数 使 用 stabs 格 式 的 系 统 上 , ’−g’ 选 项 启 动 只 有 GDB 才 使 用 的 额 外 调 试 信 息 ; 这 些 信 息 使 GDB 调 试 效 果 更 好 , 但 是 有 可 能 导 致 其 他 调 试 器 崩 溃 , 或 拒 绝 读 入 程 序 . 如 果 你 确 定 要 控 制 是 否 生 成 额 外 的 信 息 , 使 用 ’−gstabs+’, ’−gstabs’, ’−gxcoff+’, ’−gxcoff’, ’−gdwarf+’, 或 ’−gdwarf’ (见 下 文 ).
和 大 多 数 C 编 译 器 不 同 , GNU CC 允 许 结 合 使 用 ’−g’ 和 ’−O’ 选 项 . 优 化 的 代 码 偶 尔 制 造 一 些 惊 异 的 结 果 : 某 些 声 明 过 的 变 量 根 本 不 存 在 ; 控 制 流 程 直 接 跑 到 没 有 预 料 到 的 地 方 ; 某 些 语 句 因 为 计 算 结 果 是 常 量 或 已 经 确 定 而 没 有 执 行 ; 某 些 语 句 在 其 他 地 方 执 行 , 因 为 他 们 被 移 到 循 环 外 面 了 .
然 而 它 证 明 了 调 试 优 化 的 输 出 是 可 能 的 . 对 可 能 含 有 错 误 的 程 序 使 用 优 化 器 是 合 理 的 .
如 果 GNU CC 支 持 输 出 多 种 调 试 信 息 , 下 面 的 选 项 则 非 常 有 用 .
−ggdb |
以 本 地 格 式 (如 果 支 持 ) 输 出 调 试 信 息 , 尽 可 能 包 括 GDB 扩 展 . |
−gstabs
以 stabs 格 式 (如 果 支 持 ) 输 出 调 试 信 息 , 不 包 括 GDB 扩 展 . 这 是 大 多 数 BSD 系 统 上 DBX 使 用 的 格 式 .
−gstabs+
以 stabs 格 式 (如 果 支 持 ) 输 出 调 试 信 息 , 使 用 只 有 GNU 调 试 器 (GDB) 理 解 的 GNU 扩 展 . 使 用 这 些 扩 展 有 可 能 导 致 其 他 调 试 器 崩 溃 或 拒 绝 读 入 程 序 .
−gcoff |
以 COFF 格 式 (如 果 支 持 ) 输 出 调 试 信 息 . 这 是 在 System V 第 四 版 以 前 的 大 多 数 System V 系 统 上 SDB 使 用 的 格 式 . |
−gxcoff
以 XCOFF 格 式 (如 果 支 持 ) 输 出 调 试 信 息 . 这 是 IBM RS/6000 系 统 上 DBX 调 试 器 使 用 的 格 式 .
−gxcoff+
以 XCOFF 格 式 (如 果 支 持 ) 输 出 调 试 信 息 , 使 用 只 有 GNU 调 试 器 (GDB) 理 解 的 GNU 扩 展 . 使 用 这 些 扩 展 有 可 能 导 致 其 他 调 试 器 崩 溃 或 拒 绝 读 入 程 序 .
−gdwarf
以 DWARF 格 式 (如 果 支 持 ) 输 出 调 试 信 息 . 这 是 大 多 数 System V 第 四 版 系 统 上 SDB 使 用 的 格 式 .
−gdwarf+
以 DWARF 格 式 (如 果 支 持 ) 输 出 调 试 信 息 , 使 用 只 有 GNU 调 试 器 (GDB) 理 解 的 GNU 扩 展 . 使 用 这 些 扩 展 有 可 能 导 致 其 他 调 试 器 崩 溃 或 拒 绝 读 入 程 序 .
−glevel
−ggdblevel
−gstabslevel
−gcofflevel
−gxcofflevel
−gdwarflevel
请 求 生 成 调 试 信 息 , 同 时 用 level 指 出 需 要 多 少 信 息 . 默 认 的 level 值 是 2.
Level 1 输 出 最 少 量 的 信 息 , 仅 够 在 不 打 算 调 试 的 程 序 段 内 backtrace. 包 括 函 数 和 外 部 变 量 的 描 述 , 但 是 没 有 局 部 变 量 和 行 号 信 息 .
Level 3 包 含 更 多 的 信 息 , 如 程 序 中 出 现 的 所 有 宏 定 义 . 当 使 用 ’−g3’ 选 项 的 时 候 , 某 些 调 试 器 支 持 宏 扩 展 .
−p |
产 生 额 外 代 码 , 用 于 输 出 profile 信 息 , 供 分 析 程 序 prof 使 用 . | ||
−pg |
产 生 额 外 代 码 , 用 于 输 出 profile 信 息 , 供 分 析 程 序 gprof 使 用 . | ||
−a |
产 生 额 外 代 码 , 用 于 输 出 基 本 块 (basic block) 的 profile 信 息 , 它 记 录 各 个 基 本 块 的 执 行 次 数 , 供 诸 如 tcov 此 类 的 程 序 分 析 . 但 是 注 意 , 这 个 数 据 格 式 并 非 tcov 期 待 的 . 最 终 GNU gprof 将 处 理 这 些 数 据 . | ||
−ax |
产 生 额 外 代 码 , 用 于 从 ’bb.in’ 文 件 读 取 基 本 块 的 profile 参 数 , 把 profile 的 结 果 写 到 ’bb.out’ 文 件 . ’bb.in’ 包 含 一 张 函 数 列 表 . 一 旦 进 入 列 表 中 的 某 个 函 数 , profile 操 作 就 开 始 , 离 开 最 外 层 的 函 数 后 , profile 操 作 就 结 束 . 以 ’-’ 为 前 缀 名 的 函 数 排 除 在 profile 操 作 之 外 . 如 果 函 数 名 不 是 唯 一 的 , 它 可 以 写 成 ’/path/filename.d:functionname’ 来 澄 清 . ’bb.out’ 将 列 出 一 些 有 效 的 文 件 名 . 这 四 个 函 数 名 具 有 特 殊 含 义 : ’__bb_jumps__’ 导 致 跳 转 (jump) 频 率 写 进 ’bb.out’. ’__bb_trace__’ 导 致 基 本 块 序 列 通 过 管 道 传 到 ’gzip’, 输 出 ’bbtrace.gz’ 文 件 . ’__bb_hidecall__’ 导 致 从 跟 踪 (trace) 中 排 除 call 指 令 . ’__bb_showret__’ 导 致 在 跟 踪 中 包 括 返 回 指 令 . |
−dletters
编 译 的 时 候 , 在 letters 指 定 的 时 刻 做 调 试 转 储 (dump). 用 于 调 试 编 译 器 . 大 多 数 转 储 的 文 件 名 通 过 源 文 件 名 添 加 字 词 获 得 (例 如 ’foo.c.rtl’ 或 ’foo.c.jump’).
−dM |
预 处 理 结 束 的 时 候 转 储 所 有 的 宏 定 义 , 不 输 出 到 文 件 . | ||
−dN |
预 处 理 结 束 的 时 候 转 储 所 有 的 宏 名 . | ||
−dD |
预 处 理 结 束 的 时 候 转 储 所 有 的 宏 定 义 , 同 时 进 行 正 常 输 出 . | ||
−dy |
语 法 分 析 (parse) 的 时 候 在 标 准 错 误 转 储 调 试 信 息 . | ||
−dr |
RTL 阶 段 后 转 储 到 ’file.rtl’. | ||
−dx |
仅 对 函 数 生 成 RTL, 而 不 是 编 译 . 通 常 和 ’r’ 联 用 . | ||
−dj |
第 一 次 跳 转 优 化 后 转 储 到 ’file.jump’. | ||
−ds |
CSE (包 括 有 时 候 跟 在 CSE 后 面 的 跳 转 优 化 ) 后 转 储 到 ’file.cse’. | ||
−dL |
循 环 优 化 后 转 储 到 ’file.loop’. | ||
−dt |
第 二 次 CSE 处 理 (包 括 有 时 候 跟 在 CSE 后 面 的 跳 转 优 化 ) 后 转 储 到 ’file.cse2’. | ||
−df |
流 程 分 析 (flow analysis) 后 转 储 到 ’file.flow’. | ||
−dc |
指 令 组 合 (instruction combination) 后 转 储 到 ’file.combine’. | ||
−dS |
第 一 次 指 令 安 排 (instruction schedule) 后 转 储 到 ’file.sched’. | ||
−dl |
局 部 寄 存 器 分 配 后 转 储 到 ’file.lreg’. | ||
−dg |
全 局 寄 存 器 分 配 后 转 储 到 ’file.greg’. | ||
−dR |
第 二 次 指 令 安 排 (instruction schedule) 后 转 储 到 ’file.sched2’. | ||
−dJ |
最 后 一 次 跳 转 优 化 后 转 储 到 ’file.jump2’. | ||
−dd |
推 迟 分 支 调 度 (delayed branch scheduling) 后 转 储 到 ’file.dbr’. | ||
−dk |
寄 存 器 −堆 栈 转 换 后 转 储 到 ’file.stack’. | ||
−da |
产 生 以 上 所 有 的 转 储 . | ||
−dm |
运 行 结 束 后 , 在 标 准 错 误 显 示 内 存 使 用 统 计 . | ||
−dp |
在 汇 编 输 出 加 注 指 明 使 用 了 哪 些 模 式 (pattern) 及 其 替 代 模 式 . |
−fpretend−float
交 叉 编 译 的 时 候 , 假 定 目 标 机 和 宿 主 机 使 用 同 样 的 浮 点 格 式 . 它 导 致 输 出 错 误 的 浮 点 常 数 , 但 是 在 目 标 机 上 运 行 的 时 候 , 真 实 的 指 令 序 列 有 可 能 和 GNU CC 希 望 的 一 样 .
−save−temps
保 存 那 些 通 常 是 “临 时 ” 的 中 间 文 件 ; 置 于 当 前 目 录 下 , 并 且 根 据 源 文 件 命 名 . 因 此 , 用 ’−c −save−temps’ 选 项 编 译 ’foo.c ’ 会 生 成 ’foo.cpp’ 和 ’foo.s’ 以 及 ’foo.o’ 文 件 .
−print−file−name=library
显 示 库 文 件 library 的 全 路 径 名 , 连 接 时 会 使 用 这 个 库 — 其 他 什 么 事 情 都 不 作 . 根 据 这 个 选 项 , GNU CC 既 不 编 译 , 也 不 连 接 , 仅 仅 显 示 文 件 名 .
−print−libgcc−file−name
和 ’−print−file−name=libgcc.a’ 一 样 .
−print−prog−name=program
类 似 于 ’−print−file−name’, 但 是 查 找 程 序 program 如 ’cpp’.
优 化 选 项 (OPTIMIZATION OPTION)
这 些 选 项 控 制 多 种 优 化 措 施 :
−O |
|||
−O1 |
优 化 . 对 于 大 函 数 , 优 化 编 译 占 用 稍 微 多 的 时 间 和 相 当 大 的 内 存 . |
不 使 用 ’−O’ 选 项 时 , 编 译 器 的 目 标 是 减 少 编 译 的 开 销 , 使 编 译 结 果 能 够 调 试 . 语 句 是 独 立 的 : 如 果 在 两 条 语 句 之 间 用 断 点 中 止 程 序 , 你 可 以 对 任 何 变 量 重 新 赋 值 , 或 者 在 函 数 体 内 把 程 序 计 数 器 指 到 其 他 语 句 , 以 及 从 源 程 序 中 精 确 地 获 取 你 期 待 的 结 果 .
不 使 用 ’−O’ 选 项 时 , 只 有 声 明 了 register 的 变 量 才 分 配 使 用 寄 存 器 . 编 译 结 果 比 不 用 ’−O’ 选 项 的 PCC 要 略 逊 一 筹 .
使 用 了 ’−O’ 选 项 , 编 译 器 会 试 图 减 少 目 标 码 的 大 小 和 执 行 时 间 .
如 果 指 定 了 ’−O’ 选 项 , ’−fthread−jumps’ 和 ’−fdefer−pop’ 选 项 将 被 打 开 . 在 有 delay slot 的 机 器 上 , ’−fdelayed−branch’ 选 项 将 被 打 开 . 在 即 使 没 有 帧 指 针 (frame pointer) 也 支 持 调 试 的 机 器 上 , ’−fomit−frame−pointer’ 选 项 将 被 打 开 . 某 些 机 器 上 还 可 能 会 打 开 其 他 选 项 .
−O2 |
多 优 化 一 些 . 除 了 涉 及 空 间 和 速 度 交 换 的 优 化 选 项 , 执 行 几 乎 所 有 的 优 化 工 作 . 例 如 不 进 行 循 环 展 开 (loop unrolling) 和 函 数 内 嵌 (inlining). 和 −O 选 项 比 较 , 这 个 选 项 既 增 加 了 编 译 时 间 , 也 提 高 了 生 成 代 码 的 运 行 效 果 . | ||
−O3 |
优 化 的 更 多 . 除 了 打 开 −O2 所 做 的 一 切 , 它 还 打 开 了 −finline−functions 选 项 . | ||
−O0 |
不 优 化 . |
如 果 指 定 了 多 个 −O 选 项 , 不 管 带 不 带 数 字 , 最 后 一 个 选 项 才 是 生 效 的 选 项 .
诸
如 ’−fflag’ 此
类 的 选 项 描 述
一 些 机 器 无 关
的 开 关 . 大 多 数
开 关 具 有 肯 定
和 否 定 两 种 格
式 ; ’−ffoo’ 开
关 选 项 的 否 定
格 式 应 该 是
’−fno−foo’. 下 面
的 列 表 只 展 示
了 一 种 格 式 —
那 个 不 是 默 认
选 项 的 格 式 . 你
可 以 通 过 去 掉
或 添 加 ’no−’
构 造 出 另 一 种
格 式 .
−ffloat−store
不 要 在 寄 存 器 中 存 放 浮 点 变 量 . 这 样 可 以 防 止 某 些 机 器 上 不 希 望 的 过 高 精 度 , 如 68000 的 浮 点 寄 存 器 (来 自 68881) 保 存 的 精 度 超 过 了 double 应 该 具 有 的 精 度 .
对 于 大 多 数 程 序 , 过 高 精 度 只 有 好 处 . 但 是 有 些 程 序 严 格 依 赖 于 IEEE 浮 点 数 的 定 义 . 对 这 样 的 程 序 可 以 使 用 ’−ffloat−store’ 选 项 .
−fmemoize−lookups
−fsave−memoized
使 用 探 索 法 (heuristic) 进 行 更 快 的 编 译 (仅 对 C++). 默 认 情 况 下 不 使 用 探 索 法 . 由 于 探 索 法 只 对 某 些 输 入 文 件 有 效 , 其 他 程 序 的 编 译 速 度 会 变 得 更 慢 .
第 一 次 编 译 器 必 须 对 成 员 函 数 (或 对 成 员 数 据 的 引 用 ) 建 立 一 个 调 用 . 它 必 须 (1) 判 断 出 这 个 类 是 否 实 现 了 那 个 名 字 的 成 员 函 数 ; (2) 决 定 调 用 哪 个 成 员 函 数 (涉 及 到 推 测 需 要 做 哪 种 类 型 转 换 ); (3) 检 查 成 员 函 数 对 调 用 者 是 否 可 见 . 所 有 这 些 构 成 更 慢 的 编 译 . 一 般 情 形 , 第 二 次 对 成 员 函 数 (或 对 成 员 数 据 的 引 用 ) 建 立 的 调 用 , 必 须 再 次 经 过 相 同 长 度 的 处 理 . 这 意 味 着 象 这 样 的 代 码
cout << "This " << p << " has " << n << " legs.\n";
对 整 个 三 步 骤 要 做 六 次 遍 历 . 通 过 使 用 软 件 缓 存 , “命 中 ” 能 够 显 著 地 减 少 这 种 代 价 . 然 而 不 幸 的 是 , 使 用 这 种 缓 存 必 须 实 现 其 他 机 制 , 带 来 了 它 自 己 的 开 销 . ’−fmemoize−lookups’ 选 项 打 开 软 件 缓 存 .
因 为 函 数 的 正 文 环 境 不 同 , 函 数 对 成 员 和 成 员 函 数 的 访 问 权 (可 见 性 ) 也 可 能 不 同 , g++ 可 能 需 要 刷 新 缓 存 . 使 用 ’−fmemoize−lookups’ 选 项 , 每 编 译 完 一 个 函 数 就 刷 新 缓 存 . 而 ’−fsave−memoized’ 选 项 也 启 用 同 样 的 缓 存 , 但 是 当 编 译 器 发 觉 最 后 编 译 的 函 数 的 正 文 环 境 产 生 的 访 问 权 和 下 一 个 待 编 译 的 函 数 相 同 , 编 译 器 就 保 留 缓 存 内 容 . 这 对 某 个 类 定 义 许 多 成 员 函 数 时 非 常 有 用 : 除 了 某 些 其 他 类 的 友 函 数 , 每 个 成 员 函 数 拥 有 和 其 他 成 员 函 数 完 全 一 样 的 访 问 权 , 因 而 无 需 刷 新 缓 存 .
−fno−default−inline
默 认 为 不 要 把 成 员 函 数 内 嵌 , 因 为 它 们 定 义 在 类 的 作 用 域 内 (仅 C++).
−fno−defer−pop
一 旦 函 数 返 回 , 参 数 就 立 即 弹 出 . 对 于 那 些 调 用 函 数 后 必 须 弹 出 参 数 的 机 器 , 编 译 器 一 般 情 况 下 让 几 次 函 数 调 用 的 参 数 堆 积 在 栈 上 , 然 后 一 次 全 部 弹 出 .
−fforce−mem
做 数 学 运 算 前 把 将 要 使 用 的 内 存 操 作 数 送 入 寄 存 器 . 通 过 把 内 存 访 问 转 换 成 潜 在 的 公 共 子 表 达 式 , 它 可 能 产 生 较 好 的 目 标 码 . 如 果 它 们 不 是 公 共 子 表 达 式 , 指 令 组 合 应 该 消 除 各 自 的 寄 存 器 载 荷 . 我 乐 意 倾 听 不 同 意 见 .
−fforce−addr
做 数 学 运 算 前 把 将 要 使 用 的 内 存 地 址 常 数 送 入 寄 存 器 . 它 可 能 和 ’−fforce−mem’ 一 样 产 生 较 好 的 目 标 码 . 我 乐 意 倾 听 不 同 意 见 .
−fomit−frame−pointer
对 于 不 需 要 帧 指 针 (frame pointer) 的 函 数 , 不 要 在 寄 存 器 中 保 存 帧 指 针 . 这 样 能 够 避 免 保 存 , 设 置 和 恢 复 帧 指 针 的 指 令 ; 同 时 对 许 多 函 数 提 供 一 个 额 外 的 寄 存 器 . 但 是 在 大 多 数 机 器 上 将 无 法 调 试 .
某 些 机 器 上 , 如 Vax, 这 个 选 项 无 效 , 因 为 标 准 调 用 序 列 自 动 处 理 帧 指 针 , 通 过 假 装 不 存 在 而 不 保 存 任 何 东 西 . 机 器 描 述 宏 FRAME_POINTER_REQUIRED 控 制 目 标 机 是 否 支 持 这 个 选 项 .
−finline−functions
把 所 有 简 单 的 函 数 集 成 进 调 用 者 . 编 译 器 探 索 式 地 决 定 哪 些 函 数 足 够 简 单 , 值 得 这 种 集 成 .
如 果 集 成 了 所 有 给 定 函 数 的 调 用 , 而 且 函 数 声 明 为 static, 那 么 一 般 说 来 GCC 有 权 不 按 汇 编 代 码 输 出 函 数 .
−fcaller−saves
允 许 在 寄 存 器 里 分 配 数 值 , 但 是 这 个 方 案 通 常 受 到 各 个 函 数 调 用 的 冲 击 , 因 此 GCC 生 成 额 外 的 代 码 , 在 函 数 调 用 的 前 后 保 存 和 复 原 寄 存 器 内 容 . 仅 当 生 成 代 码 看 上 去 优 于 反 之 结 果 时 才 实 现 这 样 的 分 配 .
某 些 机 器 上 该 选 项 默 认 为 允 许 , 通 常 这 些 机 器 没 有 调 用 保 护 寄 存 器 代 替 使 用 .
−fkeep−inline−functions
即 使 集 成 了 某 个 函 数 的 所 有 调 用 , 而 且 该 函 数 声 明 为 static, 仍 然 输 出 这 个 函 数 一 个 独 立 的 , 运 行 时 可 调 用 的 版 本 .
−fno−function−cse
不 要 把 函 数 地 址 存 入 寄 存 器 ; 让 调 用 固 定 函 数 的 指 令 显 式 给 出 函 数 地 址 .
这 个 选 项 产 生 效 率 较 低 的 目 标 码 , 但 是 如 果 不 用 这 个 选 项 , 某 些 不 寻 常 的 hack, 改 变 汇 编 器 的 输 出 , 可 能 因 优 化 而 带 来 困 惑 .
−fno−peephole
禁 止 任 何 机 器 相 关 的 peephole 优 化 .
−ffast-math
这 个 选 项 出 于 速 度 优 化 , 允 许 GCC 违 反 某 些 ANSI 或 IEEE 规 则 /规 格 . 例 如 , 它 允 许 编 译 器 假 设 sqrt 函 数 的 参 数 是 非 负 数 .
这 个 选 项 不 被 任 何 ’−O’ 选 项 打 开 , 因 为 对 于 严 格 依 靠 IEEE 或 ANSI 规 则 /规 格 实 现 的 数 学 函 数 , 程 序 可 能 会 产 生 错 误 的 结 果 .
下 列 选 项 控 制 特 定 的 优 化 . ’−O2’ 选 项 打 开 下 面 的 大 多 数 优 化 项 , 除 了 ’−funroll−loops’ 和 ’−funroll−all−loops’ 项 .
而 ’−O’ 选 项 通 常 打 开 ’−fthread−jumps’ 和 ’−fdelayed−branch’ 优 化 项 , 但 是 特 定 的 机 器 上 的 默 认 优 化 项 有 可 能 改 变 .
如
果 特 别 情 况 下
非 常 需 要 “微 调
” 优 化 , 你 可 以
使 用 下 面 的 选
项 .
−fstrength−reduce
执 行 循 环 强 度 缩 小 (loop strength reduction) 优 化 , 并 且 消 除 重 复 变 量 .
−fthread−jumps
执 行 优 化 的 地 点 是 , 如 果 某 个 跳 转 分 支 的 目 的 地 存 在 另 一 个 条 件 比 较 , 而 且 该 条 件 比 较 包 含 在 前 一 个 比 较 语 句 之 内 , 那 么 执 行 优 化 . 根 据 条 件 是 true 或 者 false, 前 面 那 条 分 支 重 定 向 到 第 二 条 分 支 的 目 的 地 或 者 紧 跟 在 第 二 条 分 支 后 面 .
−funroll−loops
执 行 循 环 展 开 (loop unrolling) 优 化 . 仅 对 循 环 次 数 能 够 在 编 译 时 或 运 行 时 确 定 的 循 环 实 行 .
−funroll−all−loops
执 行 循 环 展 开 (loop unrolling) 优 化 . 对 所 有 循 环 实 行 . 通 常 使 程 序 运 行 的 更 慢 .
−fcse−follow−jumps
在 公 共 子 表 达 式 消 元 (common subexpression elimination) 的 时 候 , 如 果 没 有 其 他 路 径 到 达 某 个 跳 转 的 目 的 地 , 就 扫 过 这 条 jump 指 令 . 例 如 , 如 果 CSE 遇 到 带 有 else从 句 的 if 语 句 , 当 条 件 测 试 为 false 时 , CSE 就 跟 在 jump 后 面 .
−fcse−skip−blocks
它 类 似 于 ’−fcse−follow−jumps’ 选 项 , 但 是 CSE 跟 在 条 件 跳 转 后 面 , 条 件 跳 转 跳 过 了 语 句 块 (block). 如 果 CSE 遇 到 一 条 简 单 的 if 语 句 , 不 带 else 从 句 , ’−fcse−skip−blocks’ 选 项 将 导 致 CSE 跟 在 if 产 生 的 跳 转 后 面 .
−frerun−cse−after−loop
执 行 循 环 优 化 后 , 重 新 进 行 公 共 子 表 达 式 消 元 .
−felide−constructors
如 果 看 上 去 合 理 就 省 略 构 造 子 (仅 C++). 根 据 这 个 选 项 , 对 于 下 面 的 代 码 , GNU C++ 直 接 从 调 用 foo 初 始 化 y, 而 无 需 通 过 临 时 变 量 :
A foo (); A y = foo ();
如 果 没 有 这 个 选 项 , GNU C++ 首 先 通 过 调 用 类 型 A 合 适 的 构 造 子 初 始 化 y; 然 后 把 foo 的 结 果 赋 给 临 时 变 量 ; 最 后 , 用 临 时 变 量 替 换 ’y’ 的 初 始 值 .
ANSI C++ 标 准 草 案 规 定 了 默 认 行 为 (’−fno−elide−constructors’). 如 果 程 序 的 构 造 子 存 在 副 效 应 , ’−felide-constructors’ 选 项 能 够 使 程 序 有 不 同 的 表 现 , 因 为 可 能 忽 略 一 些 构 造 子 的 调 用 .
−fexpensive−optimizations
执 行 一 些 相 对 开 销 较 大 的 次 要 优 化 .
−fdelayed−branch
如 果 对 目 标 机 支 持 这 个 功 能 , 它 试 图 重 新 排 列 指 令 , 以 便 利 用 延 迟 分 支 (delayed branch) 指 令 后 面 的 指 令 空 隙 .
−fschedule−insns
如 果 对 目 标 机 支 持 这 个 功 能 , 它 试 图 重 新 排 列 指 令 , 以 便 消 除 因 数 据 未 绪 造 成 的 执 行 停 顿 . 这 可 以 帮 助 浮 点 运 算 或 内 存 访 问 较 慢 的 机 器 调 取 指 令 , 允 许 其 他 指 令 先 执 行 , 直 到 调 取 指 令 或 浮 点 运 算 完 成 .
−fschedule−insns2
类 似 于 ’−fschedule−insns’ 选 项 , 但 是 在 寄 存 器 分 配 完 成 后 , 需 要 一 个 额 外 的 指 令 调 度 过 程 . 对 于 寄 存 器 数 目 相 对 较 少 , 而 且 取 内 存 指 令 大 于 一 个 周 期 的 机 器 , 这 个 选 项 特 别 有 用 .
目 标 机 选 项 (TARGET OPTION)
缺 省 情 况 下 , GNU CC 编 译 出 本 机 类 型 的 目 标 码 . 然 而 也 可 以 把 他 安 装 成 交 叉 编 译 器 , 为 其 他 机 型 编 译 程 序 . 事 实 上 , 针 对 不 同 的 目 标 机 , 可 以 同 时 安 装 GNU CC 相 应 的 配 置 . 然 后 用 ’−b’ 选 项 指 定 目 标 机 种 .
顺
便 提 一 下 , 新 版
本 和 旧 版 本 的 GNU CC
可 以 共 存 . 其 中
一 个 版 本 (可 能
是 最 新 的 那 个 )
为 缺 省 版 本 , 但
是 有 时 候 你 希
望 使 用 其 他 版
本 .
−b machine
参 数 machine 指 出 编 译 的 目 标 机 种 . 这 个 选 项 用 于 安 装 为 交 叉 编 译 器 的 GNU CC.
参 数 machine 的 值 和 配 置 GNU CC 交 叉 编 译 器 时 设 置 的 机 器 类 型 一 样 . 例 如 , 如 果 交 叉 编 译 器 配 置 有 ’configure i386v’, 意 思 是 编 译 80386 上 的 System V 目 标 码 , 那 么 你 可 以 通 过 ’−b i386v’ 运 行 交 叉 编 译 器 .
如 果 没 有 指 定 ’−b’ 选 项 , 通 常 指 编 译 本 机 目 标 码 .
−V version
参 数 version 指 出 运 行 哪 个 版 本 的 GNU CC. 这 个 选 项 用 于 安 装 了 多 个 版 本 的 GCC. 例 如 , 如 果 version 是 ’2.0’, 意 味 着 运 行 GNU CC 2.0 版 .
如 果 没 有 指 定 ’−V’ 选 项 , 缺 省 版 本 取 决 于 GNU CC 的 安 装 方 式 , 一 般 说 来 推 荐 使 用 通 用 版 本 .
机 器 相 关 选 项 (MACHINE DEPENDENT OPTION)
每 一 种 目 标 机 型 都 有 自 己 的 特 别 选 项 , 这 些 选 项 用 ’−m ’ 开 关 引 导 , 选 择 不 同 的 硬 件 型 号 或 配 置 — 例 如 , 68010 还 是 68020, 有 没 有 浮 点 协 处 理 器 . 通 过 指 定 选 项 , 安 装 编 译 器 的 一 个 版 本 能 够 为 所 有 的 型 号 或 配 置 进 行 编 译 .
此 外 , 编 译 器 的 某 些 配 置 支 持 附 加 的 特 殊 选 项 , 通 常 是 为 了 在 命 令 行 上 兼 容 这 个 平 台 的 其 他 编 译 器 .
下
面 是 针 对 68000 系 列
定 义 的 ’−m’
选 项 :
−m68000
−mc68000
输 出 68000 的 目 标 码 . 如 果 编 译 器 按 基 于 68000 的 系 统 配 置 , 这 个 选 项 就 是 缺 省 选 项 .
−m68020
−mc68020
输 出 68020 的 目 标 码 (而 不 是 68000). 如 果 编 译 器 按 基 于 68020 的 系 统 配 置 , 这 个 选 项 就 是 缺 省 选 项 .
−m68881
输 出 包 含 68881 浮 点 指 令 的 目 标 码 . 对 于 大 多 数 基 于 68020 的 系 统 这 是 缺 省 选 项 , 除 非 设 置 编 译 器 时 指 定 了 −nfp .
−m68030
输 出 68030 的 目 标 码 . 如 果 编 译 器 按 基 于 68030 的 系 统 配 置 , 这 个 选 项 就 是 缺 省 选 项 .
−m68040
输 出 68040 的 目 标 码 . 如 果 编 译 器 按 基 于 68040 的 系 统 配 置 , 这 个 选 项 就 是 缺 省 选 项 .
−m68020−40
输 出 68040 的 目 标 码 , 但 是 不 使 用 新 指 令 . 生 成 的 代 码 可 以 在 68020/68881 上 , 也 可 以 在 68030 或 68040 上 较 有 效 地 运 行 .
−mfpa |
输 出 包 含 SUN FPA 浮 点 指 令 的 目 标 码 . |
−msoft−float
输 出 包 含 浮 点 库 调 用 的 目 标 码 . 警 告 : 所 需 的 库 不 是 GNU CC 的 组 成 部 分 . 一 般 说 来 GCC 使 用 该 机 型 本 地 C 编 译 器 的 相 应 部 件 , 但 是 作 交 叉 编 译 时 却 不 能 直 接 使 用 . 你 必 须 自 己 管 理 提 供 合 适 的 函 数 库 用 于 交 叉 编 译 .
−mshort
认 为 int 类 型 是 16 位 宽 , 相 当 于 short int.
−mnobitfield
不 使 用 位 域 (bit-field) 指 令 . ’−m68000’ 隐 含 指 定 了 ’−mnobitfield’.
−mbitfield
使 用 位 域 指 令 . ’−m68020’ 隐 含 指 定 了 ’−mbitfield’. 如 果 你 使 用 未 改 装 的 gcc, 这 就 是 默 认 选 项 .
−mrtd |
采 用 另 一 种 函 数 调 用 约 定 , 函 数 接 受 固 定 数 目 的 参 数 , 用 rtd 指 令 返 回 , 该 指 令 返 回 时 弹 出 栈 内 的 参 数 . 这 个 方 法 能 够 使 调 用 者 节 省 一 条 指 令 , 因 为 他 这 里 不 需 要 弹 出 参 数 . |
这 种 调 用 约 定 不 兼 容 UNIX 的 正 常 调 用 . 因 此 如 果 你 需 要 调 用 UNIX 编 译 器 编 译 的 库 函 数 , 你 就 不 能 使 用 这 个 选 项 .
此 外 , 所 有 参 数 数 量 可 变 地 函 数 必 须 提 供 函 数 原 型 (包 括 printf); 否 则 编 译 器 会 生 成 错 误 的 调 用 代 码 .
另 外 , 如 果 调 用 函 数 时 携 带 了 过 多 的 参 数 , 编 译 器 将 生 成 严 重 错 误 的 代 码 . (正 常 情 况 下 , 多 余 的 参 数 被 安 全 无 害 的 忽 略 .)
68010 和 68020 处 理 器 支 持 rtd 指 令 , 但 是 68000 不 支 持 .
下 面 是 针 对 VAX 定 义 的 ’−m’ 选 项 :
−munix |
禁 止 输 出 某 些 跳 转 指 令 (aobleq 等 等 ), VAX 的 UNIX 汇 编 器 无 法 跨 越 长 范 围 (long ranges) 进 行 处 理 . | ||
−mgnu |
如 果 使 用 GNU 汇 编 器 , 则 输 出 那 些 跳 转 指 令 , | ||
−mg |
输 出 g-format 浮 点 数 , 取 代 d-format. |
下 面 是 SPARC 支 持 的 ’−m’ 选 项 开 关 :
−mfpu
−mhard−float
输 出 包 含 浮 点 指 令 的 目 标 码 . 这 是 缺 省 选 项 .
−mno−fpu
−msoft−float
输 出 包 含 浮 点 库 调 用 的 目 标 码 . 警 告 : 没 有 为 SPARC 提 供 GNU 浮 点 库 . 一 般 说 来 使 用 该 机 型 本 地 C 编 译 器 的 相 应 部 件 , 但 是 不 能 直 接 用 于 交 叉 编 译 . 你 必 须 自 己 安 排 , 提 供 用 于 交 叉 编 译 的 库 函 数 .
−msoft−float 改 变 了 输 出 文 件 中 的 调 用 约 定 ; 因 此 只 有 用 这 个 选 项 编 译 整 个 程 序 才 有 意 义 .
−mno−epilogue
−mepilogue
使 用 −mepilogue (缺 省 ) 选 项 时 , 编 译 器 总 是 把 函 数 的 退 出 代 码 放 在 函 数 的 尾 部 . 任 何 在 函 数 中 间 的 退 出 语 句 (例 如 C 中 的 return 语 句 ) 将 产 生 出 跳 转 指 令 指 向 函 数 尾 部 .
使 用 −mno−epilogue 选 项 时 , 编 译 器 尽 量 在 每 个 函 数 退 出 点 嵌 入 退 出 代 码 .
−mno−v8
−mv8 |
−msparclite
这 三 个 选 项 选 择 不 同 种 类 的 SPARC 系 统 .
默 认 情 况 下 (除 非 特 别 为 Fujitsu SPARClite 配 置 ), GCC 生 成 SPARC v7 目 标 码 .
−mv8 生 成 SPARC v8 目 标 码 . 他 和 v7 目 标 码 唯 一 的 区 别 是 , 编 译 器 生 成 整 数 乘 法 和 整 数 除 法 指 令 , SPARC v8 支 持 该 指 令 , 而 v7 体 系 不 支 持 .
−msparclite 生 成 SPARClite 目 标 码 . 增 加 了 SPARClite 支 持 的 整 数 乘 法 , 整 数 除 法 单 步 扫 描 (integer divide step and scan (ffs)) 指 令 . v7 体 系 不 支 持 这 些 指 令 .
−mcypress
−msupersparc
这 两 个 选 项 选 择 处 理 器 型 号 , 针 对 处 理 器 进 行 代 码 优 化 .
−mcypress 选 项 (默 认 项 ) 使 编 译 器 对 Cypress CY7C602 芯 片 优 化 代 码 , SparcStation/SparcServer 3xx 系 列 使 用 这 种 芯 片 . 该 选 项 也 适 用 于 老 式 的 SparcStation 1, 2, IPX 等 机 型 ..
−msupersparc 选 项 使 编 译 器 对 SuperSparc 处 理 器 优 化 代 码 , SparcStation 10, 1000 和 2000 系 列 使 用 这 种 芯 片 . 同 时 该 选 项 启 用 完 整 的 SPARC v8 指 令 集 .
下 面 是 针 对 Convex 定 义 的 ’−m’ 选 项 :
−mc1 |
输 出 C1 的 目 标 码 . 当 编 译 器 对 C1 配 置 时 , 这 是 默 认 选 项 . | ||
−mc2 |
输 出 C2 的 目 标 码 . 当 编 译 器 对 C2 配 置 时 , 这 是 默 认 选 项 . |
−margcount
在 每 个 参 数 列 表 的 前 面 放 置 一 个 参 数 计 数 字 (argument count word). 某 些 不 可 移 植 的 Convex 和 Vax 程 序 需 要 这 个 参 数 计 数 字 . (调 试 器 不 需 要 他 , 除 非 函 数 带 有 变 长 参 数 列 表 ; 这 个 信 息 存 放 在 符 号 表 中 .)
−mnoargcount
忽 略 参 数 计 数 字 . 如 果 你 使 用 未 改 装 的 gcc, 这 是 默 认 选 项 .
下 面 是 针 对 AMD Am29000 定 义 的 ’−m’ 选 项 :
−mdw |
生 成 的 目 标 码 认 为 DW 置 位 , 就 是 说 , 字 节 和 半 字 操 作 由 硬 件 直 接 支 持 . 该 选 项 是 默 认 选 项 . | ||
−mnodw |
生 成 的 目 标 码 认 为 DW 没 有 置 位 . | ||
−mbw |
生 成 的 目 标 码 认 为 系 统 支 持 字 节 和 半 字 写 操 作 . 该 选 项 是 默 认 选 项 . | ||
−mnbw |
生 成 的 目 标 码 认 为 系 统 不 支 持 字 节 和 半 字 写 操 作 . 该 选 项 隐 含 开 启 了 ’−mnodw’ 选 项 . |
−msmall
使 用 小 内 存 模 式 , 小 内 存 模 式 假 设 所 有 函 数 的 地 址 位 于 某 个 256 KB 段 内 , 或 者 所 有 函 数 的 绝 对 地 址 小 于 256K. 这 样 就 可 以 用 call 指 令 代 替 const, consth, calli 指 令 序 列 .
−mlarge
假 设 不 能 使 用 call 指 令 ; 这 是 默 认 选 项 .
−m29050
输 出 Am29050 的 目 标 码 .
−m29000
输 出 Am29000 的 目 标 码 . 这 是 默 认 选 项 .
−mkernel−registers
生 成 的 目 标 码 引 用 gr64-gr95 寄 存 器 而 不 是 gr96-gr127 寄 存 器 . 该 选 项 可 以 用 于 编 译 内 核 代 码 , 内 核 需 要 一 组 全 局 寄 存 器 , 这 些 全 局 寄 存 器 和 用 户 模 式 使 用 的 寄 存 器 完 全 无 关 .
注 意 , 使 用 这 个 选 项 时 , ’−f’ 选 项 中 的 寄 存 器 名 字 必 须 是 normal, user-mode, names.
−muser−registers
使 用 普 通 全 局 寄 存 器 集 gr96-gr127. 这 是 默 认 选 项 .
−mstack−check
在 每 次 堆 栈 调 整 后 插 入 一 条 __msp_check 调 用 . 这 个 选 项 常 用 于 内 核 代 码 .
下
面 是 针 对 Motorola 88K 体
系 定 义 的
’−m’ 选 项 :
−m88000
生 成 的 目 标 码 可 以 在 m88100 和 m88110 上 正 常 工 作 .
−m88100
生 成 的 目 标 码 在 m88100 上 工 作 的 最 好 , 但 也 可 以 在 m88110 上 运 行 .
−m88110
生 成 的 目 标 码 在 m88110 上 工 作 的 最 好 , 可 能 不 能 在 m88100 上 运 行 .
−midentify−revision
在 汇 编 器 的 输 出 端 包 含 一 条 ident 指 令 , 记 录 源 文 件 名 , 编 译 器 名 字 和 版 本 , 时 标 , 以 及 使 用 的 编 译 选 项 ,
−mno−underscores
在 汇 编 器 的 输 出 端 , 符 号 名 字 前 面 不 添 加 下 划 线 . 默 认 情 况 是 在 每 个 名 字 前 面 增 加 下 划 线 前 缀 .
−mno−check−zero−division
−mcheck−zero−division
早 期 型 号 的 88K 系 统 在 除 零 操 作 上 存 在 问 题 , 特 定 情 况 下 许 多 机 器 无 法 自 陷 . 使 用 这 些 选 项 可 以 避 免 包 含 (或 可 以 显 明 包 含 ) 附 加 的 代 码 , 这 些 代 码 能 够 检 查 除 零 错 , 发 送 例 外 信 号 . GCC 所 有 88K 的 配 置 默 认 使 用 ’−mcheck−zero−division’ 选 项 .
−mocs−debug−info
−mno−ocs−debug−info
包 含 (或 忽 略 ) 附 加 的 调 试 信 息 (关 于 每 个 栈 架 结 构 中 寄 存 器 的 使 用 ), 88Open Object Compatibility Standard, “OCS”, 对 此 信 息 做 了 说 明 . GDB 不 需 要 这 些 额 外 信 息 . DG/UX, SVr4, 和 Delta 88 SVr3.2 的 默 认 配 置 是 包 含 调 试 信 息 , 其 他 88k 机 型 的 默 认 配 置 是 忽 略 这 个 信 息 .
−mocs−frame−position
−mno−ocs−frame−position
强 制 (或 不 要 求 ) 把 寄 存 器 值 存 储 到 栈 架 结 构 中 的 指 定 位 置 (按 OCS 的 说 明 ). DG/UX, Delta88 SVr3.2 和 BCS 的 默 认 配 置 使 用 ’−mocs−frame−position’ 选 项 ; 其 他 88k 机 型 的 默 认 配 置 是 ’−mno−ocs−frame−position’.
−moptimize−arg−area
−mno−optimize−arg−area
控 制 如 何 在 堆 栈 结 构 中 存 储 函 数 参 数 . ’−moptimize−arg−area’ 节 省 空 间 , 但 是 有 可 能 宕 掉 某 些 调 试 器 (不 是 GDB). ’−mno−optimize−arg−area’ 证 实 比 标 准 选 项 好 . 默 认 情 况 下 GCC 不 优 化 参 数 域 .
−mshort−data−
num 通 过 和 r0 关 联 , 产 生 较 小 的 数 据 引 用 (data reference), 这 样 就 可 以 用 单 指 令 调 入 一 个 数 值 (而 不 是 平 常 的 双 指 令 ). 用 户 通 过 选 项 中 的 num 控 制 改 变 哪 种 数 据 引 用 . 例 如 , 如 果 你 指 定 了 ’−mshort−data−512’, 那 么 受 影 响 的 数 据 引 用 是 小 于 512 字 节 的 数 据 移 动 . −mshort−data−num选 项 对 大 于 64K 的 num 无 效 .
−mserialize-volatile
−mno-serialize-volatile
产 生 , 或 不 产 生 代 码 来 保 证 对 易 变 内 存 访 问 的 结 果 一 致 .
对 于 常 用 的 处 理 器 子 型 号 , GNU CC 始 终 默 认 保 证 这 种 一 致 性 . 如 何 实 现 结 果 一 致 取 决 于 处 理 器 子 型 号 .
m88100 处 理 器 不 对 内 存 引 用 重 新 安 排 , 因 此 访 问 结 果 始 终 一 致 . 如 果 使 用 了 ’−m88100’ 选 项 , GNU CC 不 产 生 任 何 针 对 结 果 一 致 的 特 别 指 令 .
m88110 处 理 器 的 内 存 引 用 顺 序 并 不 始 终 符 合 指 令 请 求 的 引 用 顺 序 . 特 别 是 某 条 读 取 指 令 可 能 在 先 前 的 存 储 指 令 之 前 执 行 . 多 处 理 器 环 境 下 , 乱 序 访 问 扰 乱 了 易 变 内 存 访 问 的 结 果 一 致 . 因 此 当 使 用 ’−m88000’ 或 ’−m88110’ 选 项 时 , GNU CC 在 适 当 的 时 候 产 生 特 别 的 指 令 迫 使 执 行 顺 序 正 确 .
这 些 用 于 保 证 一 致 性 的 额 外 代 码 有 可 能 影 响 程 序 的 性 能 . 如 果 你 确 认 能 够 安 全 地 放 弃 这 种 保 证 , 你 可 以 使 用 ’−mno-serialize-volatile’ 选 项 .
如 果 你 使 用 ’−m88100’ 选 项 , 但 是 需 要 在 m88110 处 理 器 上 运 行 时 的 结 果 一 致 , 你 应 该 加 上 ’−mserialize-volatile’ 选 项 .
−msvr4
−msvr3 |
打 开 (’−msvr4’) 或 关 闭 (’−msvr3’) 和 System V 第 四 版 (SVr4) 相 关 的 编 译 器 扩 展 . 效 果 如 下 : | ||
• |
输 出 哪 种 汇 编 语 法 (你 可 以 使 用 ’−mversion−03.00’ 选 项 单 独 选 择 ). | ||
• |
’−msvr4’ 使 C 预 处 理 器 识 别 ’#pragma weak’ 指 令 | ||
• |
’−msvr4’ 使 GCC 输 出 额 外 的 声 明 指 令 (declaration directive), 用 于 SVr4. |
除
了 SVr4 配 置 ,
’−msvr3’ 是 所 有
m88K 配 置 的 默 认 选
项 .
−mtrap−large−shift
−mhandle−large−shift
包 含 一 些 指 令 , 用 于 检 测 大 于 31 位 的 位 移 (bit-shift); 根 据 相 应 的 选 项 , 对 这 样 的 位 移 发 出 自 陷 (trap) 或 执 行 适 当 的 处 理 代 码 . 默 认 情 况 下 , GCC 对 大 位 移 不 做 特 别 处 理 .
−muse−div−instruction
很 早 以 前 的 88K 型 号 没 有 (div) 除 法 指 令 , 因 此 默 认 情 况 下 GCC 避 免 产 生 这 条 指 令 . 而 这 个 选 项 告 诉 GCC 该 指 令 是 安 全 的 .
−mversion−03.00
在 DG/UX 配 置 中 存 在 两 种 风 格 的 SVr4. 这 个 选 项 修 改 −msvr4 , 选 择 hybrid-COFF 或 real-ELF 风 格 . 其 他 配 置 均 忽 略 该 选 项 .
−mwarn−passed−structs
如 果 某 个 函 数 把 结 构 当 做 参 数 或 结 果 传 递 , GCC 发 出 警 告 . 随 着 C 语 言 的 发 展 , 人 们 已 经 改 变 了 传 递 结 构 的 约 定 , 它 往 往 导 致 移 植 问 题 . 默 认 情 况 下 , GCC 不 会 发 出 警 告 .
下 面 的 选 项 用 于 IBM RS6000:
−mfp−in−toc
−mno−fp−in−toc
控 制 是 否 把 浮 点 常 量 放 到 内 容 表 (TOC) 中 , 内 容 表 存 放 所 有 的 全 局 变 量 和 函 数 地 址 . 默 认 情 况 下 , GCC 把 浮 点 常 量 放 到 这 里 ; 如 果 TOC 溢 出 , ’−mno−fp−in−toc’ 选 项 能 够 减 少 TOC 的 大 小 , 这 样 就 可 以 避 免 溢 出 .
下
面 的 ’−m’ 选
项 用 于 IBM RT PC:
−min−line−mul
对 于 整 数 乘 法 使 用 嵌 入 代 码 . 这 是 默 认 选 项 .
−mcall−lib−mul
对 于 整 数 乘 法 使 用 lmul$$ .
−mfull−fp−blocks
生 成 全 尺 寸 浮 点 数 据 块 , 包 括 IBM 建 议 的 最 少 数 量 的 活 动 空 间 (scratch space). 这 是 默 认 选 项 .
−mminimum−fp−blocks
不 要 在 浮 点 数 据 块 中 包 括 额 外 的 活 动 空 间 . 这 样 就 产 生 较 小 但 是 略 慢 的 可 执 行 程 序 , 因 为 活 动 空 间 必 须 动 态 分 配 .
−mfp−arg−in−fpregs
采 用 不 兼 容 IBM 调 用 约 定 的 调 用 序 列 , 通 过 浮 点 寄 存 器 传 送 浮 点 参 数 . 注 意 , 如 果 指 定 了 这 个 选 项 , varargs.h 和 stdargs.h 将 无 法 支 持 浮 点 单 元 .
−mfp−arg−in−gregs
使 用 正 常 的 调 用 约 定 处 理 浮 点 参 数 . 这 是 默 认 选 项 .
−mhc−struct−return
通 过 内 存 返 回 大 于 一 个 字 的 结 构 , 而 不 是 通 过 寄 存 器 . 用 于 兼 容 MetaWare HighC (hc) 编 译 器 . 使 用 ’−fpcc−struct−return’ 选 项 可 以 兼 容 Portable C 编 译 器 (pcc).
−mnohc−struct−return
如 果 可 以 , 通 过 寄 存 器 返 回 某 些 大 于 一 个 字 的 结 构 . 这 是 默 认 选 项 . 如 果 打 算 兼 容 IBM 提 供 的 编 译 器 , 请 使 用 ’−fpcc−struct−return’ 或 ’−mhc−struct−return’ 选 项 .
下
面 的 ’−m’ 选
项 用 于 MIPS 家 族 的
计 算 机 :
−mcpu=cpu-type
生 成 指 令 的 时 候 , 假 设 默 认 的 机 器 类 型 是 cpu-type . 默 认 情 况 下 的 cpu-type 是 default, 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 函 数 (memcpy 或 bcopy), 而 不 是 生 成 嵌 入 代 码 .
−mmips−tfile
−mno−mips−tfile
当 MIPS 汇 编 器 生 成 mips−tfile 文 件 (用 于 帮 助 调 试 ) 后 , −mno−mips−tfile 开 关 选 项 阻 止 编 译 器 使 用 mips−tfile 后 期 处 理 (postprocess) 目 标 文 件 . 不 运 行 mips−tfile 就 没 有 调 试 器 关 注 的 局 部 变 量 . 另 外 , stage2 和 stage3 目 标 文 件 将 把 临 时 文 件 名 传 递 给 汇 编 器 , 嵌 在 目 标 文 件 中 , 这 意 味 着 不 比 较 目 标 文 件 是 否 相 同 .
−msoft−float
输 出 包 含 浮 点 库 调 用 . 警 告 : 所 需 库 不 是 GNU CC 的 一 部 分 . 一 般 说 来 使 用 该 机 型 本 地 C 编 译 器 的 相 应 部 件 , 但 是 不 能 直 接 用 于 交 叉 编 译 , 你 必 须 自 己 安 排 , 提 供 交 叉 编 译 适 用 的 库 函 数 .
−mhard−float
输 出 包 含 浮 点 指 令 . 如 果 编 译 器 没 有 被 改 动 , 这 就 是 默 认 选 项 .
−mfp64 |
编 译 器 认 为 状 态 字 的 FR 置 位 (on), 也 就 是 说 存 在 32 64-bit 浮 点 寄 存 器 , 而 不 是 32 32-bit 浮 点 寄 存 器 . 同 时 必 须 打 开 −mcpu=r4000 和 −mips3 开 关 . | ||
−mfp32 |
认 为 存 在 32 32-bit 浮 点 寄 存 器 . 这 是 默 认 选 项 . |
−mabicalls
−mno−abicalls
输 出 (或 不 输 出 ) .abicalls, .cpload, 和 .cprestore 伪 指 令 , 某 些 System V.4 版 本 用 于 位 置 无 关 代 码 .
−mhalf−pic
−mno−half−pic
−mhalf−pic 开 关 选 项 要 求 把 外 部 引 用 的 指 针 放 到 数 据 段 , 并 且 载 入 内 存 , 而 不 放 到 正 文 段 . 该 选 项 目 前 不 起 作 用 .
−G num |
把 小 于 等 于 num 字 节 的 全 局 或 静 态 数 据 放 到 小 的 数 据 段 或 bss 段 , 而 不 是 普 通 的 数 据 段 或 bss 段 . 这 样 汇 编 器 可 以 输 出 基 于 全 局 指 针 (gp 或 $28), 的 单 字 内 存 访 问 指 令 而 非 普 通 的 双 字 指 令 . 默 认 情 况 下 , 用 MIPS 汇 编 器 时 num 是 8, 而 GNU 汇 编 器 则 为 0. 另 外 , −Gnum 选 项 也 被 传 递 给 汇 编 器 和 连 接 器 . 所 有 的 模 块 必 须 在 相 同 的 −Gnum 值 下 编 译 . | ||
−nocpp |
汇 编 用 户 汇 编 文 件 (带 有 ’.s’ 后 缀 ) 时 , 告 诉 MIPS 汇 编 器 不 要 运 行 预 处 理 器 . |
下
面 的 ’−m’ 选
项 用 于 Intel 80386 族 计
算 机 : −m486
−mno−486
控 制 是 否 生 成 对 486 优 化 的 代 码 .
−msoft−float
输 出 包 含 浮 点 库 调 用 . 警 告 : 所 需 库 不 是 GNU CC 的 一 部 分 . 一 般 说 来 使 用 该 机 型 本 地 C 编 译 器 的 相 应 部 件 , 但 是 不 能 直 接 用 于 交 叉 编 译 , 你 必 须 自 己 安 排 , 提 供 交 叉 编 译 适 用 的 库 函 数 .
在 函 数 把 浮 点 返 回 值 放 在 80387 寄 存 器 栈 的 机 器 上 , 即 使 设 置 了 ’−msoft-float’ 选 项 , 也 可 能 会 发 出 一 些 浮 点 操 作 码 .
−mno-fp-ret-in-387
不 用 FPU 寄 存 器 返 回 函 数 值 .
通 常 函 数 调 用 约 定 把 float 和 double 的 返 回 值 放 在 FPU 寄 存 器 中 , 即 使 不 存 在 FPU. 这 种 作 法 的 理 念 是 操 作 系 统 应 该 仿 真 出 FPU.
而 ’−mno-fp-ret-in-387’ 选 项 使 浮 点 值 通 过 普 通 的 CPU 寄 存 器 返 回 .
下
面 的 ’−m’ 选
项 用 于 HPPA 族 计 算
机 :
−mpa-risc-1-0
生 成 PA 1.0 处 理 器 的 目 标 码 .
−mpa-risc-1-1
生 成 PA 1.1 处 理 器 的 目 标 码 .
−mkernel
生 成 适 用 于 内 核 的 目 标 码 . 特 别 要 避 免 add 指 令 , 它 有 一 个 参 数 是 DP 寄 存 器 ; 用 addil 代 替 add指 令 . 这 样 可 以 避 免 HP-UX 连 接 器 的 某 个 严 重 bug.
−mshared-libs
生 成 能 够 连 接 HP-UX 共 享 库 的 目 标 码 . 该 选 项 还 没 有 实 现 全 部 功 能 , 对 PA 目 标 默 认 为 关 闭 . 使 用 这 个 选 项 会 导 致 编 译 器 生 成 错 误 的 目 标 码 .
−mno-shared-libs
不 生 成 连 接 HP-UX 共 享 库 的 目 标 码 . 这 是 PA 目 标 的 默 认 选 项 .
−mlong-calls
生 成 的 目 标 码 允 许 同 一 个 源 文 件 中 的 函 数 调 用 , 调 用 点 和 被 调 函 数 的 距 离 可 以 超 过 256K 之 远 . 不 需 要 打 开 这 个 开 关 选 项 , 除 非 连 接 器 给 出 “branch out of range errors“ 这 样 的 错 误 .
−mdisable-fpregs
防 止 任 何 情 况 下 使 用 浮 点 寄 存 器 . 编 译 内 核 需 要 这 个 选 项 , 内 核 切 换 浮 点 寄 存 器 的 执 行 环 境 速 度 非 常 缓 慢 . 如 果 打 开 了 这 个 开 关 选 项 同 时 试 图 浮 点 操 作 , 编 译 将 失 败 .
−mdisable-indexing
防 止 编 译 器 使 用 索 引 地 址 模 式 (indexing address mode). 这 样 在 MACH 上 编 译 MIG 生 成 的 代 码 时 , 可 以 避 免 一 些 非 常 晦 涩 的 问 题 .
−mtrailing-colon
在 标 记 定 义 (label definition) 的 末 尾 添 加 一 个 冒 号 (用 于 ELF 汇 编 器 ).
下
面 的 ’−m’ 选
项 用 于 Intel 80960 族 计
算 机 :
−mcpu-type
默 认 机 器 类 型 为 cpu-type , 使 编 译 器 产 生 对 应 的 指 令 , 地 址 模 式 和 内 存 对 齐 . 默 认 的 cpu-type 是 kb; 其 他 选 择 有 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
函 数 返 回 struct 和 union 值 时 , 采 用 和 本 地 编 译 器 相 同 的 参 数 约 定 . 对 于 较 小 的 结 构 , 这 种 约 定 的 效 率 偏 低 , 而 且 很 多 机 器 上 不 能 重 入 ; 它 的 优 点 是 允 许 GCC 编 译 的 目 标 码 和 PCC 编 译 的 目 标 码 互 相 调 用 .
−freg−struct−return
一 有 可 能 就 通 过 寄 存 器 返 回 struct 和 union 函 数 值 . 对 于 较 小 的 结 构 , 它 比 −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手 册 页 翻 译 计 划 》
跋
本
页 面 中 文 版 由
中 文 man 手 册 页 计
划 提 供 。
中 文 man 手 册 页 计
划 :
https://github.com/man-pages-zh/manpages-zh