C 和 C + + 的 每 个 实 现 对 它 的 主 机 或 操 作 系 统 都 支 持 一 些 独 有 的 特 征 。 例 如 , 某 些程 序 须 对 存 放 数 据 的 存 储 器 区 域 进 行 精 确 的 控 制 , 或 必 须 控 制 特 定 函 数 接 受 参 量的 方 式 。 # p r a g m a 指 令 对 每 个 编 译 器 给 出 了 一 个 方 法 , 在 保 持 与 C 和 C + + 语 言 完全 兼 容 的 情 况 下 , 给 出 主 机 或 操 作 系 统 专 有 的 特 征 。 依 据 定 义 , 编 译 指 示 是 机 器或 操 作 系 统 专 有 的 , 且 对 于 每 个 编 译 器 都 是 不 同 的 。
语 法
# p r a g m a 语 言 符 号 字 符 串
语 言 符 号 字 符 串 是 给 出 特 有 编 译 器 指 令 和 参 量 的 字 符 序 列 。 数 字 符 号 ( # ) 必 须 是包 含 编 译 指 示 行 中 的 第 一 个 非 空 白 字 符 。 空 白 字 符 可 分 开 数 字 符 号 ( # ) 和 单 词p r a g m a 。 在 # p r a g m a 之 后 , 可 以 编 写 翻 译 器 作 为 预 处 理 器 语 言 符 号 分 析 的 任 何文 本 。 # p r a g m a 的 参 量 从 属 于 宏 扩 展 。
如 果 编 译 器 找 到 一 个 不 能 识 别 的 编 译 指 示 , 将 发 出 一 个 警 告 , 但 编 译 将 继 续 。
编 译 指 示 可 用 在 条 件 说 明 中 , 以 提 供 新 的 预 处 理 器 功 能 , 或 提 供 定 义 的 实 现 信 息给 编 译 器 。 C 和 C + + 编 译 器 可 识 别 下 面 的 编 译 指 示 :
a l l o c _ t e x t
c o m m e n t
i n i t _ s e g *
o p t i m i z e
a u t o _ i n l i n e
c o m p o n e n t
i n l i n e _ d e p t h
p a c k
b s s _ s e g d a t a _ s e g i n l i n e _ r e c u r s i o n p o i n t e r s _ t o _ m e m b e
r s *
c h e c k _ s t a c k f u n c t i o n i n t r i n s i c s e t l o c a l e
c o d e _ s e g h d r s t o p m e s s a g e v t o r d i s p *
c o n s t _ s e g i n c l u d e _ a l i
a s
o n c e w a r n i n g
* 仅 被 C + + 编 译 器 支 持
C + + 编 译 器 专 有 编 译 指 示
以 下 是 C + + 编 译 器 专 有 的 编 译 指 示 指 令 :
z i n i t _ s e g
z p o i n t e r s _ t o _ m e m b e r s
z v t o r d i s p
i n i t _ s e g
C + + 特 殊 处 →
# p r a g m a i n i t
-
s e g ( { c o m p l i e r / l i b / u s e r / "s e c t i o n - n a m e " [ , "f u n c - n a m e " ] } )
该 指 令 指 定 一 个 影 响 启 动 代 码 执 行 顺 序 的 关 键 字 或 代 码 段 。 由 于 全 局 静 态 对 象
的 初 始 化 可 能 涉 及 执 行 代 码 , 因 此 必 须 指 定 创 建 对 象 时 定 义 的 一 个 关 键 字 。 在 动态 连 接 库 ( D L L ) 或 需 初 始 化 的 库 中 使 用 i n i t _ s e g 编 译 指 示 尤 其 重 要 。
i n i t _ s e g 编 译 指 示 的 选 项 如 下 :
c o m p l i e r
该 选 项 保 留 给 M i c r o s o f t C 运 行 库 初 始 化 。 这 个 组 中 的 对 象 最 先 被 创 建 。
l i b
用 于 第 三 方 类 库 供 应 商 的 初 始 化 。 该 组 中 的 对 象 在 c o m p l i e r 标 志 之 后 , 其 他 标
记 之 前 创 建 。
u s e r
用 于 任 何 用 户 。 此 组 对 象 最 后 创 建 。
s e c t i o n
_
n a m e
允 许 初 始 化 段 的 显 示 规 格 。 在 一 个 用 户 指 定 s e c t i o n - n a m e ( 段 名 称 ) 中 的 对 象 不
能 被 隐 含 地 创 建 , 但 它 们 的 地 址 可 放 在 以 s e c t i o n _ n a m e 命 名 的 段 中 。
f u n c
_
n a m e
指 定 在 程 序 退 出 时 在 e x i t ( ) 地 方 调 用 的 函 数 。 指 定 的 函 数 必 须 与 e x i t 函 数 具
有 相 同 的 特 征 :
i n t f u n c n a m e ( v o i d ( _ _ c d e c l * ) ( v o i d ) ) ;
如 果 你 需 要 延 迟 初 始 化 过 程 ( 例 如 , 在 一 个 D L L 中 ) , 你 可 以 选 择 显 式 地 指 定 该 段
名 称 。 然 后 必 须 为 每 个 静 态 对 象 调 用 构 造 函 数 。
C + + 特 殊 处 结 束
p o i n t e r s _ t o _ m e m b e r s
C + + 特 殊 处 →
# p r o g m a p o i n t e r s _ t o _ m e m b e r s ( 指 针 说 明 , [ 最 一 般 表 示 ] )
该 指 令 指 定 一 个 类 成 员 的 指 针 能 否 在 其 相 关 定 义 之 前 被 说 明 , 且 用 于 控 制 该 指 针
尺 寸 和 解 释 该 指 针 需 要 的 代 码 。 你 可 以 把 一 个 p o i n t e r s _ t o _ m e m b e r s 编 译 指 示
放 入 你 的 源 文 件 中 替 换 / v m x 编 译 器 选 项 。
指 针 说 明 参 量 指 定 你 在 一 个 关 联 函 数 定 义 之 前 还 是 之 后 说 明 了 一 个 成 员 的 指
针 。 指 针 说 明 参 量 是 以 下 两 个 符 号 之 一 :
参 量 说 明
f u l l _ g e n e r a l i t
y
生 成 安 全 、 但 常 常 并 非 最 优 的 代 码 。 如 果 在 关 联 类 定 义
之 前 说 明 任 何 成 员 的 指 针 , 可 使 用 f u l l _ g e n e r a l i t y 。 该
参 量 通 常 使 用 最 一 般 表 示 参 量 指 定 的 指 针 表 示 形 式 。 等
同 于 / v m g 选 项
b e s t _ c a s e 为 所 有 成 员 指 针 使 用 最 佳 情 况 ( b e s t
_ _
c a s e ) 表 示 生 成 安 全
的 最 优 代 码 。 使 用 该 参 量 是 需 在 定 义 一 个 类 的 成 员 指 针
说 明 之 前 定 义 此 类 。 其 缺 省 值 为 b e s t _ c a s e
最 一 般 表 示 参 量 说 明 了 在 转 换 单 元 中 , 编 译 器 能 够 安 全 地 引 用 任 何 指 向 类 成 员 的
指 针 的 最 小 指 针 表 示 。 该 参 量 取 如 下 值 之 一 :
参 量 说 明
s i n g l e _ i n h e r i t a n c
e
最 一 般 表 示 是 单 继 承 的 , 即 一 个 成 员 函 数 的 指 针 。 对
于 其 中 说 明 了 一 个 指 向 成 员 指 针 的 一 个 类 定 义 , 若 其
继 承 模 式 说 明 为 多 重 的 或 虚 拟 的 , 将 导 致 错 误
续 表
m u l t i p l e _ i n h e r i t a
n c e
最 一 般 表 示 是 多 重 继 承 的 , 即 一 个 成 员 函 数 的 指 针 。
对 于 其 中 说 明 了 一 个 指 向 成 员 指 针 的 一 个 类 定 义 , 若
其 继 承 模 式 是 虚 拟 的 , 将 导 致 错 误
v i t u a l _ i n h e r i t a n c
e
最 一 般 表 示 是 虚 拟 继 承 , 即 一 个 成 员 函 数 的 指 针 。 该
函 数 不 会 导 致 错 误 。 当 使 用
#pragmapointers_to_members(full_generality) 时 这 是 个
缺 省 参 量
C + + 特 殊 处 结 束
v t o r d i s p
C + + 特 殊 处 →
# p r a g m a v t o r d i s p ( { o n | o f f } )
该 指 令 允 许 增 加 隐 含 的 v t o r d i s p 构 造 函 数 / 析 构 函 数 替 换 成 员 。 v t o r d i s p 编 译
指 示 只 使 用 虚 基 类 的 代 码 。 若 一 个 派 生 类 重 迭 一 个 从 虚 拟 基 类 继 承 的 虚 拟 函 数 ,
且 如 果 派 生 类 的 一 个 构 造 函 数 或 析 构 函 数 调 用 那 个 使 用 该 虚 拟 基 类 指 针 的 函 数 ,
则 编 译 器 可 能 将 增 加 的 隐 含 “ v t o r d i s p ” 域 到 有 虚 拟 基 的 类 中 。
v t o r d i s p 编 译 指 示 会 影 响 其 后 类 的 分 布 。 / V d 0 或 / V d 1 选 项 指 定 了 对 于 完 全 模
式 的 相 同 动 作 。 指 定 o f f 将 抑 制 隐 含 的 v t o r d i s p 成 员 。 指 定 缺 省 值 o n , 将 在
需 要 的 位 置 打 开 它 们 。 V t o r d i s p 指 令 仅 在 类 的 构 造 / 析 构 函 数 在 用 t h i s 指 针 指
向 的 对 象 处 不 可 能 调 用 虚 拟 函 数 时 关 闭 。
# p r a g m a v t o r d i s p ( o f f )
c l a s s G e t R e a l : v i r t u a l p u b l i c { . . . } ;
# p r a g m a v t o r d i s p ( o n )
C + + 特 殊 处 结 束
C 和 C + + 编 译 器 编 译 指 示
以 下 是 为 C 和 C + + 编 译 器 定 义 的 编 译 指 示 :
a l l o c _ t e x t c o m p o n e n t i n i t _ s e g * o p t i m i z e
a u t o _ i n l i n e c o n s t _ s e g i n l i n e _ d e p t h p a c k
b s s _ s e g d a t a _ s e g i n l i n e _ r e c u r s i
o n
p o i n t e r s _ t o _ m e m b e
r s *
c h e c k _ s t a c k f u n c t i o n i n t r i n s i c s e t l o c a l e
c o d e _ s e g h d r s t o p m e s s a g e v t o r d i s p *
c o m m e n t i n c l u d e _ a l i a s o n c e w a r n i n g
* 仅 被 C + + 编 译 器 支 持
a l l o c _ t e x t
# p r a g m a a l l o c _ t e x t ( “ 文 本 段 ” , 函 数 1 , . . . )
该 指 令 用 于 命 名 指 定 的 函 数 定 义 将 要 驻 留 的 代 码 段 。 该 编 译 指 示 对 已 命 名 的 函
数 必 须 出 现 在 一 个 函 数 说 明 符 和 该 函 数 定 义 之 间 。
a l l o c t _ t e x t 编 译 指 示 并 不 处 理 C + + 成 员 函 数 或 重 载 函 数 。 它 仅 用 于 以 C 连 接 方式 说 明 的 函 数 , 这 指 的 是 用 e x t e r n “ C ” 连 接 规 格 说 明 的 函 数 。 如 果 你 试 图 将 此
编 译 指 示 用 于 非 C + + 连 接 的 函 数 , 将 产 生 一 个 编 译 错 误 。
由 于 不 支 持 使 用
_ _
b a s e d 的 函 数 地 址 , 指 定 段 位 址 需 要 使 用 a l l o c _ t e x t 编 译 指 示 ,
以 文 本 段 指 定 的 名 称 应 包 括 在 双 引 号 间 。
a l l o c _ t e x t 编 译 指 示 必 须 出 现 在 指 定 的 函 数 说 明 之 后 , 这 些 函 数 的 定 义 之 前 。
一 个 a l l o c _ t e x t 编 译 指 示 中 的 函 数 引 用 必 须 在 此 编 译 指 示 的 同 一 模 块 中 定 义 。
如 果 未 这 样 做 , 且 一 个 未 定 义 的 函 数 随 后 被 编 译 到 一 个 不 同 的 文 本 段 , 则 这 个 错
误 可 能 找 得 到 , 也 可 能 找 不 到 。 虽 然 该 程 序 一 般 会 正 常 运 行 , 但 该 函 数 不 会 分 配
到 预 期 的 段 中 。
a l l o c _ t e x t 的 其 他 限 制 如 下 :
z 它 不 能 用 在 一 个 函 数 的 内 部 。
z 它 必 须 在 已 说 明 的 函 数 之 后 和 已 定 义 的 函 数 之 前 使 用 。
a u t o _ i n l i n e
# p r a g m a a u t o _ i n l i n e ( [ { o n | o f f } ] )
排 除 自 动 内 联 扩 展 的 候 选 者 中 指 定 为 o f f 的 区 域 中 定 义 的 函 数 。 为 了 使 用
a u t o _ i n l i n e 编 译 指 示 , 把 它 放 在 一 个 函 数 定 义 之 前 或 立 即 之 后 ( 不 在 该 函 数 定
义 之 内 ) 。 在 看 到 该 编 译 指 示 之 后 的 第 一 个 函 数 定 义 处 , 该 编 译 指 示 发 生 作 用 。
编 译 指 示 a u t o _ i n l i n e 不 能 应 用 于 显 式 内 联 函 数 。
b s s _ s e g
# p r a g m a d a t a
-
s e g ( [ " s e c t i o n - n a m e " [ , " s e c t i o n - c l a s s " ] ] )
指 定 未 初 始 化 数 据 的 缺 省 段 。 d a t a _ s e g 编 译 指 示 处 理 初 始 化 或 未 初 始 化 数 据 有
相 同 的 作 用 。 在 某 些 情 况 下 , 你 可 以 使 用 b s s _ s e g 通 过 把 所 有 未 初 始 化 数 据 放 在
一 个 段 中 来 加 速 加 载 的 时 间 。
# p r a g m a b s s _ s e g ( " M Y _ D A T A " )
导 致 # p r a g m a 语 句 后 未 初 始 化 的 数 据 分 配 到 一 个 名 称 为 M Y _ D A T A 的 段 中 。
用 b s s _ s e g 编 译 指 示 分 配 的 数 据 不 会 保 留 关 于 它 的 位 置 的 任 何 信 息 。
第 二 个 参 量 s e c t i o n _ c l a s s 用 于 与 V i s u a l C + + 之 前 的 版 本 兼 容 , 现 在 已 被 忽 略 。
c h e c k _ s t a c k
# p r a g m a c h e c k _ s t a c k ( [ { o n | o f f } ] )
# p r a g m a c h e c k _ s t a c k { + | - }
该 指 令 在 o f f ( 或 - ) 选 项 时 指 示 编 译 器 关 闭 栈 搜 索 。 在 o n ( 或 + ) 选 项 指 定 时 , 打 开
搜 索 。
若 无 参 量 , 栈 搜 索 就 按 缺 省 情 况 处 理 。 在 看 到 该 编 译 指 示 之 后 第 一 个 定 义 的 函 数
处 发 生 作 用 。 栈 搜 索 既 不 是 宏 的 一 部 分 , 也 不 是 产 生 的 内 联 函 数 的 一 部 分 。
如 果 未 赋 予 一 个 参 量 给 c h e c k _ s t a c k 编 译 指 示 , 栈 检 查 将 还 原 成 在 命 令 行 中 说 明
的 行 为 , 有 关 更 多 的 信 息 参 见 “ 编 译 器 参 考 ”。 # p r a g m a c h e c k _ s t a c k 和 / G s 选 项
的 交 互 关 系 参 见 表 2 . 1 。
表 2 . 1 使 用 c h e c k _ s t a c k 编 译 指 示
语 法 是 否 用 / G s 选 项 编 译 行 为
# p r a g m a c h e c k _ s t a c k ( ) 或
# p r a g m a c h e c k _ s t a c k
是 关 闭 其 后 函 数 的 栈 检
查
# p r a g m a c h e c k _ s t a c k ( ) 或
# p r a g m a c h e c k _ s t a c k
否 打 开 其 后 函 数 的 栈 检
查
# p r a g m a c h e c k _ s t a c k ( o n )
或
# p r a g m a c h e c k _ s t a c k +
是 或 否 打 开 其 后 函 数 的 栈 检
查
# p r a g m a c h e c k _ s t a c k ( o f f )
或
# p r a g m a c h e c k _ s t a c k -
是 或 否 关 闭 其 后 函 数 的 栈 检
查
c o d e _ s e g
# p r a g m a c o d e _ s e g ( [ " s e c t i o n - n a m e " [ , " s e c t i o n - c l a s s " ] ] )
该 指 令 用 于 指 定 一 个 分 配 函 数 的 代 码 段 。 c o d e _ s e g 编 译 指 示 指 定 了 函 数 的 缺 省
段 。
你 可 以 有 选 择 性 地 指 定 类 和 段 名 。 使 用 没 有 s e c t i o n - n a m e 字 符 串 的 # p r a g m a
c o d e _ s e g 可 在 编 译 开 始 时 将 其 复 位 。
c o n s t _ s e g
# p r a g m a c o n s t _ s e g ( [ " s e c t i o n - n a m e " [ , " s e c t i o n - c l a s s " ] ] )
该 指 令 用 于 指 定 对 于 常 量 数 据 的 缺 省 段 。 d a t a _ s e g 编 译 指 示 对 所 有 数 据 具 有 相
同 作 用 。 你 可 以 用 此 指 令 将 你 的 所 有 常 量 数 据 放 入 一 个 只 读 段 中 。
# p r a g m a c o n s t _ s e g ( " M Y _ D A T A " )
导 致 该 指 令 将 # p r a g m a 语 句 后 的 常 量 数 据 放 入 一 个 名 称 为 M Y _ D A T A 的 段 里 。
使 用 c o n s t _ s e g 编 译 指 示 分 配 的 数 据 不 会 保 留 有 关 它 的 位 置 的 任 何 信 息 。
第 二 个 参 数 s e c t i o n - c l a s s 用 于 与 V i s u a l C + + 2 . 0 版 之 前 的 版 本 兼 容 , 现 在 已
可 忽 略 。
c o m m e n t
# p r a g m a c o m m e n t ( c o m m e n t - t y p e , [ c o m m e n t s t r i n g ] )
该 指 令 将 一 个 注 释 记 录 放 入 一 个 对 象 文 件 或 可 执 行 文 件 中 。 c o m m e n t - t y p e 是 下
面 五 种 说 明 的 预 定 义 标 识 符 之 一 , 它 们 指 出 了 注 释 记 录 的 类 型 。 任 选 的
c o m m e n t s t r i n g 是 给 一 些 注 释 类 型 提 供 额 外 信 息 的 字 符 串 文 字 。 由 于
c o m m e n t s t r i n g 是 一 个 字 符 串 文 字 , 因 此 它 必 须 遵 循 对 于 字 符 串 文 字 的 诸 如 转
义 字 符 、 嵌 入 或 引 号 标 记 ( " ) 以 及 合 并 的 所 有 规 则 。
c o m p l i e r
该 选 项 将 编 译 器 的 名 称 和 版 本 号 放 入 对 象 文 件 中 。 这 个 注 释 记 录 被 链 接 器 忽 略 ,
如 果 你 为 这 个 记 录 类 型 给 出 一 个 c o m m e n t s t r i n g 参 量 , 该 编 译 器 将 产 生 一 个 警 告信 息 。
e x e s t r
该 选 项 将 c o m m e n t s t r i n g 放 入 对 象 文 件 中 。 在 连 接 时 , 该 字 符 串 被 置 入 可 执 行 文
件 中 。
该 字 符 串 并 不 与 可 执 行 文 件 同 时 加 载 到 存 储 器 , 但 它 可 用 在 文 件 中 寻 找 可 打 印 字
符 串 的 程 序 找 到 。 这 个 注 释 记 录 类 型 的 一 个 用 途 是 把 版 本 号 或 类 似 信 息 嵌 入 到
一 个 可 执 行 文 件 中 。
l i b
该 选 项 将 一 个 库 搜 索 记 录 放 入 对 象 文 件 。 该 注 释 类 型 必 须 带 有 一 个
c o m m e n t s t r i n g 参 数 。 这 个 参 数 包 含 你 想 要 的 链 接 器 搜 索 的 库 的 名 称 ( 有 可 能 包
含 路 径 ) 。 由 于 在 对 象 文 件 中 该 库 名 称 在 缺 省 的 库 搜 索 记 录 之 前 , 所 以 链 接 器 搜
索 该 库 就 象 你 在 命 令 行 中 命 名 了 它 一 样 。 你 可 以 把 多 个 库 搜 索 记 录 放 在 同 一 个
源 文 件 中 , 每 个 记 录 在 对 象 文 件 中 都 以 其 在 源 文 件 中 出 现 的 同 样 顺 序 出 现 。
l i n k e r
该 选 项 将 一 个 链 接 器 选 项 放 入 对 象 文 件 中 。 可 以 用 该 注 释 类 型 指 定 一 个 链 接 器
选 项 , 用 于 取 代 在 P r o j e c t S e t t i n g 对 话 框 中 L i n k 选 项 卡 上 放 入 该 选 项 。 例 如 ,
你 可 以 指 定 / i n c l u d e 选 项 来 强 行 包 括 一 个 符 号 :
# p r a g m a c o m m e n t ( l i n k e r , " / i n c l u d e :
_ _
s y m b o l " )
u s e r
该 选 项 将 一 个 一 般 的 注 释 放 入 对 象 文 件 中 。 c o m m e n t s t r i n g 参 量 包 含 了 该 注 释
的 文 本 。 这 个 注 释 记 录 被 链 接 器 忽 略 。
以 下 编 译 指 示 导 致 链 接 器 在 连 接 时 搜 索 E M A P I . L I B 库 。 该 连 接 器 首 先 在 当 前 工
作 目 录 中 搜 索 , 随 后 在 L I B 环 境 变 量 说 明 的 路 径 中 搜 索 。
# p r a g m a c o m m e n t ( l i b , " e m a p i " )
以 下 编 译 指 示 导 致 编 译 器 把 编 译 器 的 名 称 和 版 本 号 放 入 对 象 文 件 :
# p r a g m a c o m m e n t ( c o m p l i e r )
注 意 : 对 于 一 个 带 c o m m e n t s t r i n g 参 量 的 注 释 , 你 可 以 在 任 何 要 使 用 一 个 字 符 串
文 字 的 地 方 使 用 宏 , 让 这 个 宏 扩 展 为 一 个 字 符 串 文 字 。 你 也 可 以 把 任 何 一 个 字 符
串 文 字 的 任 何 组 合 与 扩 展 为 字 符 串 文 字 的 宏 合 并 起 来 , 例 如 : 下 面 的 语 句 是 可 以
接 受 的 :
# p r a g m a c o m m e n t ( u s e r , " C o m p i l e d o n " _ _ D A T A _ _ " a t " _ _ T I M E _ _ )
c o m p o n e n t
# p r a g m a c o m p o n e n t ( b r o w s e r , { o n | o f f } [ , r e f e r e n c e s [ , n a m e ] ] )
# p r a g m a c o m p o n e n t ( m i n r e b u i l d , o n | o f f )
该 指 令 用 于 控 制 源 文 件 内 的 浏 览 信 息 或 依 赖 信 息 的 集 合 。
b r o w s e r
你 可 以 打 开 或 关 闭 集 合 , 并 可 以 在 收 集 信 息 时 指 定 忽 略 的 特 定 名 称 。
用 o n 或 o f f 选 项 控 制 前 面 编 译 指 示 的 浏 览 信 息 的 集 合 。 例 如 :
# p r a g m a c o m p o n e n t ( b r o w s e r , o f f )
该 指 令 让 编 译 器 停 止 收 集 浏 览 信 息 。
注 意 : 用 此 指 令 打 开 浏 览 信 息 的 集 合 , 浏 览 信 息 必 须 先 用 P r o j e c t S e t t i n g s 对 话
框 或 命 令 行 打 开 。
r e f e r e n c e s 选 项 可 带 也 可 不 带 n a m e 参 量 。 不 带 n a m e 参 量 的 r e f e r e n c e s 选 项
用 于 打 开 或 关 闭 引 用 的 集 合 ( 但 此 时 继 续 收 集 其 它 浏 览 信 息 ) 。 例 如 :
# p r a g m a c o m p o n e n t ( b r o w s e r , o f f , r e f e r e n c e s )
该 指 令 使 编 译 器 停 止 收 集 引 用 信 息 。
带 n a m e 和 o f f 参 量 的 r e f e r e n c e s 选 项 , 用 于 防 止 浏 览 信 息 窗 口 中 出 现 对 n a m e
的 引 用 。 使 用 这 种 语 法 可 忽 略 你 不 感 兴 趣 的 名 称 和 类 型 , 并 且 可 缩 短 浏 览 信 息
的 尺 寸 。 例 如 :
# p r a g m a c o m p o n e n t ( b r o w s e r , o f f , r e f e r e n c e s , D W O R D )
忽 略 该 点 之 前 对 于 D W O R D 的 引 用 。 但 你 可 用 o n 选 项 把 对 于 D W O R D 引 用 的 集 合 重
新 打 开 。
# p r a g m a c o m p o n e n t ( b r o w s e r , o n , r e f e r e n c e s , D W O R D )
这 是 恢 复 对 n a m e 引 用 集 合 唯 一 的 方 式 ; 用 此 方 式 你 可 以 显 式 地 打 开 任 何 你 已 经
关 闭 的 n a m e 。
为 了 防 止 预 处 理 器 把 n a m e 展 开 ( 如 把 N U L L 扩 展 为 0 ) , 将 它 加 上 引 号 :
# p r a g m a c o m p o n e n t ( b r o w s e r , o f f , r e f e r e n c e s , " N U L L " )
M i n i m a l R e b u i l d
V i s u a l C + + 的 m i n i m a l r e b u i l d ( 最 小 重 建 ) 特 性 需 要 编 译 器 创 建 和 存 储 依 赖 信
息 的 C + + 类 , 这 将 占 用 磁 盘 空 间 。 为 了 节 省 磁 盘 空 间 , 你 可 以 在 任 何 你 不 需 收 集
依 赖 信 息 的 时 候 仅 用 # p r a g m a c o m p o n e n t ( m i n i r e b u i l d , o f f ) , 例 如 , 在 不 变 的 头
文 件 中 。 在 不 变 的 类 后 插 入 # p r a g m a c o m p o n e n t ( m i n r e b u i l d , o n ) 可 重 新 打 开 依
赖 信 息 。
有 关 更 多 的 信 息 参 见 E n a b l e M i n i m a l R e b u i l d ( / G m ) 编 译 器 选 项 。
d a t a _ s e g
# p r a g m a d a t a _ s e g ( [ " s e c t i o n - n a m e " [ , " s e c t i o n - c l a s s " ] ] )
该 指 令 指 定 数 据 的 缺 省 段 。 例 如 :
# p r a g m a d a t a _ s e g ( " M Y _ D A T A " )
将 # p r a g m a 语 句 后 分 配 的 数 据 放 在 以 名 称 为 M Y _ D A T A 的 段 里 。
使 用 d a t a _ s e g 编 译 指 示 分 配 的 数 据 不 会 保 留 关 于 它 的 位 置 的 任 何 信 息 。
第 二 个 参 量 s e c t i o n - c l a s s 用 于 与 V i s u a l C + + 2 . 0 之 前 的 版 本 兼 容 , 现 在 已 可
忽 略 。
f u n c t i o n
# p r a g m a f u n c t i o n ( f u n c t i o n 1 [ , f u n c t i o n 2 , . . . ] )
该 指 令 指 定 对 在 生 成 的 编 译 器 编 译 指 示 参 量 表 中 指 定 调 用 的 函 数 。 如 果 你 使 用
i n t r i n s i c 编 译 指 示 ( 或 / O i ) 告 诉 编 译 器 生 成 内 在 函 数 ( 被 生 成 为 内 联 代 码 , 而 非函 数 调 用 的 内 在 函 数 ) , 就 能 用 f u n c t i o n 编 译 指 示 来 显 式 地 强 制 调 用 一 个 函 数 。
当 一 个 函 数 编 译 指 示 出 现 时 , 它 在 第 一 个 包 含 一 个 指 定 的 内 在 函 数 的 函 数 定 义 处
发 生 作 用 , 这 个 作 用 持 续 到 源 文 件 的 结 尾 或 直 到 一 个 说 明 这 种 相 同 的 内 在 函 数 的
编 译 指 示 出 现 为 止 。 在 全 局 层 时 , 该 f u n c t i o n 编 译 指 示 只 能 用 在 一 个 函 数 外 。
对 于 具 有 内 部 形 式 的 函 数 表 , 参 见 # p r a g m a i n t r i n s i c 。
h d r s t o p
# p r a g m a h d r s t o p [ ( " f i l e n a m e " ) ]
该 指 令 用 于 控 制 预 编 译 头 文 件 的 工 作 方 式 。 f i l e n a m e 是 预 编 译 头 文 件 使 用 或 创
建 的 名 称 ( 根 据 指 定 选 项 / Y u 或 / Y c 决 定 ) 。 如 果 f i l e n a m e 不 包 含 路 径 说 明 , 预 编
译 头 文 件 将 被 假 定 在 与 源 文 件 相 同 的 目 录 中 。 当 指 定 / Y X 自 动 预 编 译 头 文 件 选
项 时 , 所 有 f i l e n a m e 都 被 忽 略 。
当 采 用 / Y X 或 / Y c 编 译 时 , 一 个 C 或 C + + 文 件 包 含 一 个 h d r s t o p 编 译 指 示 , 该 编 译
器 将 把 编 译 状 态 存 入 到 编 译 指 示 的 位 置 。 该 编 译 指 示 之 后 任 何 代 码 的 编 译 状 态
都 不 存 储 。
h d r s t o p 编 译 指 示 不 可 能 出 现 在 一 个 头 文 件 中 。 它 必 须 出 现 在 源 文 件 中 。 这 指
的 是 , 它 不 能 出 现 在 任 何 数 据 、 函 数 说 明 或 函 数 定 义 中 。
注 意 : 除 非 / Y X 选 项 或 无 文 件 名 的 / Y u 或 / Y c 选 项 被 指 定 , 否 则 h d r s t o p 编 译 指 示
将 被 忽 略 。
该 指 令 使 用 f i l e n a m e 命 名 编 译 状 态 存 储 的 预 编 译 头 文 件 。 h d r s t o p 和 f i l e n a m e
之 间 的 一 个 空 白 是 任 选 的 。 在 h d r s t o p 编 译 指 示 中 说 明 的 文 件 名 称 是 一 个 字 符
串 , 而 且 必 须 服 从 C 或 C + + 字 符 串 的 约 束 。 尤 其 重 要 的 是 必 须 将 其 置 于 括 号 中 ,如 下 例 所 示 :
# p r a g m a h d r s t o p ( " c : \ p r o j e c t s \ i n c l u d e \ m y i n c . p c h " )
预 编 译 头 文 件 的 名 称 由 下 列 规 则 决 定 , 顺 序 如 下 :
1 . / F p 编 译 器 选 项 的 参 量 。
2 . # p r a g m a h d r s t o p 的 f i l e n a m e 参 量 。
3 . 以 . P C H 为 扩 展 名 的 源 文 件 的 基 名 称 。
i n c l u d e _ a l i a s
# p r a g m a i n c l u d e _ a l i a s ( " l o n g _ f i l e n a m e " , " s h o r t _ f i l e n a m e " )
# p r a g m a i n c l u d e _ a l i a s ( < l o n g _ f i l e n a m e > , < s h o r t _ f i l e n a m e > )
该 指 令 指 定 s h o r t _ f i l e n a m e 作 为 l o n g _ f i l e n a m e 的 别 名 。 某 些 文 件 系 统 允 许 比
8 . 3 F A T 文 件 系 统 限 定 更 长 的 文 件 名 。 编 译 器 不 能 够 简 单 地 把 更 长 的 头 文 件 名
截 短 为 8 . 3 格 式 , 因 为 这 种 更 长 的 头 文 件 名 的 开 始 八 个 字 符 可 能 不 是 唯 一 的 。 只
要 编 译 器 遇 到 l o n g _ f i l e n a m e 字 符 串 , 就 用 s h o r t _ f i l e n a m e 替 换 , 并 且 代 替 查 找
s h o r t _ f i l e n a m e 头 文 件 。 这 个 编 译 指 示 必 须 出 现 在 相 应 的 # i n c l u d e 指 令 之 前 ,
例 如 :
/ / 这 两 个 文 件 的 开 头 八 个 字 符 不 是 唯 一 的
# p r a g m a i n c l u d e _ a l i a s ( " A p p l e S y s t e m H e a d e r Q u i c k d r a w . h " , " q u i c k d r a . h " )
# p r a g m a i n c l u d e _ a l i a s ( " A p p l e S y s t e m H e a d e r F r u i t . h " , " f r u i t . h " )
# p r a g m a i n c l u d e _ a l i a s ( " G r a p h i c s M e n u . h " , " g r a m e n u . h " )
# i n c l u d e " A p p l e S y s t e m H e a d e r Q u i c k d r a w . h "
# i n c l u d e " A p p l e S y s t e m H e a d e r F r u i t . h "
# i n c l u d e " G r a p h i c s M e n u . h "
无 论 是 拼 写 , 还 是 双 引 号 或 尖 括 号 的 用 法 , 被 搜 索 的 别 名 都 必 须 符 合 规 格 。
i n c l u d e _ a l i a s 编 译 指 示 在 该 文 件 名 中 处 理 简 单 的 字 符 串 匹 配 , 而 在 其 它 的 文 件
名 中 是 无 效 的 。 例 如 , 给 出 如 下 指 令 :
# p r a g m a i n c l u d e _ a l i a s ( " m y m a t h . h " , " m a t h . h " )
# i n c l u d e " . / m y m a t h . h "
# i n c l u d e " s y s / m y m a t h . h "
没 有 别 名 使 用 ( 替 换 ) 被 执 行 , 因 为 头 文 件 字 符 串 并 不 匹 配 。 用 作 / Y u 、 / Y c 和 / Y X
编 译 器 选 项 参 量 的 头 文 件 名 , 或 h d r s t o p 编 译 指 示 的 头 文 件 名 也 不 能 被 替 换 。 例
如 , 若 你 的 源 文 件 包 含 下 列 指 令 :
# i n c l u d e < A p p l e S y s t e m H e a d e r S t o p . h >
相 应 的 编 译 器 选 项 应 该 是 :
/ Y c A p p l e S y s t e m H e a d e r S t o p . h
你 可 以 用 i n c l u d e _ a l i a s 编 译 指 示 把 任 何 头 文 件 名 映 射 为 另 一 个 。 例 如 :
# p r a g m a i n c l u d e _ a l i a s ( " a p i . h " , " c : \ v e r s i o n 1 . 0 \ a p i . h " )
# p r a g m a i n c l u d e _ a l i a s ( < s t d i o . h > , < n e w s t d i o . h > )
# i n c l u d e " a p i . h "
# i n c l u d e < s t d i o . h >
不 要 把 双 引 号 内 的 文 件 名 和 尖 括 号 内 的 文 件 名 相 混 淆 , 例 如 , 对 于 上 面 给 出 的 两
个 # p r a g m a i n c l u d e _ a l i a s 指 令 , 编 译 器 在 下 面 的 # i n c l u d e 指 令 中 不 执 行 任 何 替换 :
# i n c l u d e < a p i . h >
i n c l u d e " s t d i o . h "
此 外 , 下 面 的 指 令 将 导 致 错 误 :
# p r a g m a i n c l u d e _ a l i a s ( < h e a d e r . h > , " h e a d e r . h " ) / / 错 误
注 意 在 错 误 信 息 中 给 出 的 文 件 名 , 或 作 为 预 先 定 义 的
_ _
F I L E
_ _
宏 的 值 , 是 替 换 执 行
之 后 的 文 件 的 名 称 , 例 如 , 下 面 指 令 后 :
# p r a g m a i n c l u d e _ a l i a s ( " V e r y L o n g F i l e N a m e . H " , " m y f i l e . h " )
# i n c l u d e " V e r y L o n g F i l e N a m e . H "
在 V E R Y L O N G F I L E N A M E . H 中 的 一 个 错 误 将 导 致 如 下 错 误 消 息 :
m y f i l e . h ( 1 5 ) : e r r o r c 2 0 5 9 : s y n t a x e r r o r
同 时 注 意 传 递 性 是 不 支 持 的 。 如 下 指 令 中 :
# p r a g m a i n c l u d e _ a l i a s ( " o n e . h " , " t w o . h " )
# p r a g m a i n c l u d e _ a l i a s ( " t w o . h " , " t h r e e . h " )
# i n c l u d e " o n e . h "
编 译 器 搜 索 的 是 文 件 T W O . H 而 不 是 T H R E E . H 。
i n l i n e _ d e p t h
# p r a g m a i n l i n e _ d e p t h ( [ 0 . . . 2 5 5 ] )
该 指 令 通 过 控 制 一 系 列 函 数 调 用 能 被 扩 展 的 次 数 ( 从 0 到 2 5 5 次 ) , 来 控 制 内 联 扩
展 可 发 生 的 次 数 。 这 个 编 译 指 示 控 制 标 记 为 i n l i n e 和
_ _
i n l i n e 的 函 数 的 联 编 或
在 / O b 2 选 项 下 已 经 自 动 联 编 的 函 数 。
i n l i n e _ d e p t h 编 译 指 示 控 制 一 序 列 函 数 调 用 能 被 扩 展 的 次 数 , 例 如 , 若 联 编 深 度
为 4 , 且 若 A 调 用 B , B 调 用 C , 三 个 调 用 都 将 内 联 扩 展 。 但 如 果 最 近 的 内 联 扩 展 为
2 , 只 有 A 和 B 被 扩 展 , C 保 留 为 一 个 函 数 调 用 。
为 使 用 这 个 编 译 指 示 , 你 必 须 设 置 / O b 编 译 器 选 项 为 1 或 2 。 使 用 这 个 编 译 指 示
的 深 度 设 置 在 该 编 译 指 示 指 令 后 的 第 一 个 函 数 处 生 效 。 如 果 你 没 有 在 圆 括 号 中
指 定 一 个 值 , i n l i n e _ d e p t h 将 设 置 联 编 深 度 为 缺 省 值 8 。
联 编 深 度 在 扩 展 时 只 减 不 增 。 若 联 编 深 度 为 6 , 且 在 扩 展 时 , 预 处 理 器 遇 到 一 个
联 编 深 度 值 为 8 的 i n l i n e _ d e p t h 编 译 指 示 , 该 深 度 仍 保 持 为 6 。
联 编 深 度 0 禁 止 联 编 扩 展 ; 联 编 深 度 2 5 5 对 联 编 扩 展 无 限 制 , 若 使 用 一 个 未 指 定
其 值 的 编 译 指 示 , 则 将 使 用 其 缺 省 值 。
i n l i n e _ r e c u r s i o n
# p r a g m a i n l i n e _ r e c u r s i o n ( [ { o n | o f f } ] )
该 指 令 控 制 直 接 或 相 互 递 归 函 数 调 用 的 联 编 扩 展 。该 指 令 用 于 控 制 标 记 为 i n l i n e
和
_ _
i n l i n e 的 函 数 , 或 编 译 器 在 O b 2 选 项 下 自 动 扩 展 的 函 数 。 这 个 编 译 指 示 的 用
法 需 要 一 个 设 置 为 1 或 2 的 / O b 编 译 器 选 项 。 i n l i n e _ r e c u r s i o n 的 缺 省 状 态 是
o f f 。 这 个 编 译 指 示 只 是 在 其 出 现 之 后 的 第 一 个 函 数 处 起 作 用 , 并 且 不 会 影 响 该
函 数 的 定 义 。
i n l i n e _ r e c u r s i o n 编 译 指 示 控 制 递 归 函 数 如 何 被 扩 展 。 如 果 i n l i n e _ r e c u r s i o n
关 闭 , 且 若 一 个 联 编 函 数 调 用 其 自 身 ( 直 接 或 间 接 ) , 该 函 数 只 被 扩 展 一 次 。 若
i n l i n e _ r e c u r s i o n 为 打 开 状 态 , 则 该 函 数 将 被 扩 展 多 次 直 到 其 达 到
i n l i n e _ d e p t h 的 值 , 或 达 到 其 容 量 值 的 限 制 。
i n t r i n s i c
# p r a g m a i n t r i n s i c ( f u n c t i o n 1 [ , f u n c t i o n 2 , . . . ] )
该 指 令 指 定 对 于 在 编 译 指 示 参 量 表 中 说 明 的 函 数 的 调 用 是 内 在 的 。 编 译 器 生 成
象 联 编 代 码 的 内 在 函 数 , 而 并 不 像 函 数 调 用 那 样 。 具 有 内 在 格 式 的 库 函 数 如 下
表 。 当 遇 到 一 个 i n t r i n s i c 编 译 指 示 时 , 它 在 一 个 包 含 指 定 的 内 在 函 数 的 第 一 个
函 数 定 义 处 发 生 作 用 , 其 作 用 延 续 到 源 文 件 的 结 尾 , 或 直 到 一 个 说 明 相 同 的 内 在
函 数 的 f u n c t i o n 编 译 指 示 出 现 为 止 。
i n t r i n s i c 编 译 指 示 只 能 用 在 一 个 函 数 定 义 之 外 ( 全 局 级 ) 。
以 下 函 数 具 有 内 在 格 式 :
_ d i s a b l e _ o u t p f a b s s t r c m p
_ e n a b l e _ o u t p w l a b s s t r c p y
_ i n p _ r o t l m e m c m p s t r l e n
_ i n p w _ r o t r m e m c p y
_ l r o t l _ s t r s e t m e m s e t
_ l r o t r a b s s t r c a t
使 用 内 在 函 数 的 程 序 更 快 , 因 为 它 们 没 有 函 数 调 用 的 额 外 开 销 , 但 由 于 产 生 的 额
外 代 码 , 它 们 会 更 大 一 些 。
注 意 : _ a l l o c a 和 s e t j m p 函 数 总 是 联 编 生 成 的 , 这 种 行 为 不 会 受 i n t r i n s i c 编 译
指 示 的 影 响 。
以 下 所 列 的 浮 点 函 数 没 有 真 正 的 内 在 格 式 。 但 它 们 有 这 样 的 版 本 : 将 参 量 直 接 送
入 浮 点 芯 片 , 而 不 是 将 它 们 压 入 程 序 栈 中 :
a c o s c o s h p o w t a n h
a s i n f m o d s i n h
当 你 指 定 / O i 和 / O g 编 译 器 选 项 ( 或 任 何 包 括 / O g 、 / O x 、 / O 1 和 / O 2 的 选 项 ) 时 , 以
下 浮 点 函 数 有 真 正 的 内 在 格 式 :
a t a n e x p l o g 1 0 s q r t
a t a n 2 l o g s i n t a n
c o s
你 可 以 使 用 / O p 或 / Z a 编 译 器 选 项 重 迭 真 正 的 内 在 浮 点 选 项 的 生 成 。这 种 情 况 下 ,
该 函 数 被 生 成 为 库 例 程 , 该 例 程 直 接 把 参 量 送 入 浮 点 芯 片 , 而 不 是 把 它 们 压 入 程
序 栈 。
m e s s a g e
# p r a g m a m e s s a g e ( m e s s a g e s t r i n g )
该 指 令 不 终 止 编 译 , 直 接 把 一 个 字 符 串 文 字 送 到 标 准 输 出 。 m e s s a g e 编 译 指 示 的
典 型 用 法 是 在 编 译 时 显 示 信 息 消 号 。 以 下 代 码 段 使 用 m e s s a g e 编 译 指 示 在 编 译
时 显 示 一 个 消 息 :
# i f _ M _ I X 8 6 = = 5 0 0
# p r a g m a m e s s a g e ( " P e n t i u m p r o c e s s o r b u i l d " )
# e n d i f
m e s s a g e s t r i n g 参 数 可 以 是 可 扩 展 为 一 个 字 符 串 文 字 的 宏 , 并 且 你 可 以 以 任 何 组
合 方 式 用 字 符 串 文 字 将 这 些 宏 合 并 起 来 。 例 如 , 下 列 语 句 显 示 了 被 编 译 的 文 件 名
以 及 该 文 件 最 后 改 动 的 日 期 和 时 间 :
# p r a g m a m e s s a g e ( " C o m p i l i n g " _ _ F I L E _ _ )
# p r a g m a m e s s a g e ( " L a s t m o d i f i e d o n " _ _ T I M E S T A M P _ _ )
o n c e
# p r a g m a o n c e
该 指 令 指 定 该 编 译 指 示 驻 留 的 文 件 将 只 在 一 次 建 立 中 被 编 译 器 包 括 ( 打 开 ) 一
次 。 该 编 译 指 示 的 一 种 普 通 用 法 如 下 :
/ / h e a d e r . h
# p r a g m a o n c e
/ / 接 着 是 你 的 C 或 C + + 代 码
o p t i m i z e
# p r a g m a o p t i m i z e ( " [ o p t i m i z a t i o n - l i s t ] " , { o n | o f f } )
仅 用 于 专 业 和 企 业 版 本 的 特 征 : 代 码 优 化 只 被 V i s u a l C + + 专 业 版 和 企 业 版 支 持 。
更 多 的 信 息 参 见 M i c r o s o f t V i s u a l C + + 联 机 编 辑 。
该 指 令 指 定 在 函 数 基 中 执 行 的 优 化 。 o p t i m i z e 编 译 指 示 必 须 出 现 在 一 个 函 数 之
外 , 并 且 在 编 译 指 示 出 现 后 定 义 的 第 一 个 函 数 处 产 生 作 用 。 o n 和 o f f 参 量 可 以
打 开 或 关 闭 在 O p t i m i z a t i o n - l i s t 中 指 定 的 选 项 。
o p t i m i z a t i o n - l i s t 可 以 是 0 或 在 表 2 . 2 中 给 出 参 数 。
表 2 . 2 " 优 化 " 编 译 指 示 的 参 数
参 量 优 化 类 型
a 假 定 无 别 名
g 允 许 全 局 优 化
p 提 高 浮 点 相 容 性
s 或 t 指 定 机 器 码 的 短 或 快 序 列
w 假 定 无 交 叉 函 数 调 用 的 别 名
y 生 成 程 序 堆 栈 中 的 框 架 指 针
这 些 是 采 用 / O 编 译 器 选 项 的 相 同 字 母 , 例 如 :
# p r a g m a o p t i m i z e ( " a t p " , o n )
用 空 字 符 串 ( " " ) 使 用 o p t i m i z e 编 译 指 示 是 该 指 令 的 一 种 特 殊 形 式 , 它 可 关 闭 所
有 的 优 化 或 恢 复 它 们 的 原 有 ( 缺 省 的 ) 设 置 。
# p r a g m a o p t i m i z e ( " " , o f f )
.
.
.
# p r a g m a o p t i m i z e ( " " , o n )
p a c k
# p r a g m a p a c k ( [ n ] )
该 指 令 指 定 结 构 和 联 合 成 员 的 紧 凑 对 齐 。 而 一 个 完 整 的 转 换 单 元 的 结 构 和 联 合的 紧 凑 对 齐 由 / Z p 选 项 设 置 。 紧 凑 对 齐 用 p a c e 编 译 指 示 在 数 据 说 明 层 设 置 。 该
编 译 指 示 在 其 出 现 后 的 第 一 个 结 构 或 联 合 说 明 处 生 效 。 该 编 译 指 示 对 定 义 无 效 。
当 你 使 用 # p r a g m a p a c k ( n ) 时 , 这 里 n 为 1 、 2 、 4 、 8 或 1 6 。 第 一 个 结 构 成 员 之
后 的 每 个 结 构 成 员 都 被 存 储 在 更 小 的 成 员 类 型 或 n 字 节 界 限 内 。 如 果 你 使 用 无
参 量 的 # p r a g m a p a c k , 结 构 成 员 被 紧 凑 为 以 / Z p 指 定 的 值 。 该 缺 省 / Z p 紧 凑 值 为
/ Z p 8 。
编 译 器 也 支 持 以 下 增 强 型 语 法 :
# p r a g m a p a c k ( [ [ { p u s h | p o p } , ] [ 标 识 符 , ] ] [n ] )
若 不 同 的 组 件 使 用 p a c k 编 译 指 示 指 定 不 同 的 紧 凑 对 齐 , 这 个 语 法 允 许 你 把 程 序
组 件 组 合 为 一 个 单 独 的 转 换 单 元 。
带 p u s h 参 量 的 p a c k 编 译 指 示 的 每 次 出 现 将 当 前 的 紧 凑 对 齐 存 储 到 一 个 内 部 编
译 器 堆 栈 中 。 编 译 指 示 的 参 量 表 从 左 到 右 读 取 。 如 果 你 使 用 p u s h , 则 当 前 紧 凑
值 被 存 储 起 来 ; 如 果 你 给 出 一 个 n 的 值 , 该 值 将 成 为 新 的 紧 凑 值 。 若 你 指 定 一 个
标 识 符 , 即 你 选 定 一 个 名 称 , 则 该 标 识 符 将 和 这 个 新 的 的 紧 凑 值 联 系 起 来 。
带 一 个 p o p 参 量 的 p a c k 编 译 指 示 的 每 次 出 现 都 会 检 索 内 部 编 译 器 堆 栈 顶 的 值 ,
并 且 使 该 值 为 新 的 紧 凑 对 齐 值 。 如 果 你 使 用 p o p 参 量 且 内 部 编 译 器 堆 栈 是 空 的 ,
则 紧 凑 值 为 命 令 行 给 定 的 值 , 并 且 将 产 生 一 个 警 告 信 息 。 若 你 使 用 p o p 且 指 定 一
个 n 的 值 , 该 值 将 成 为 新 的 紧 凑 值 。
若 你 使 用 p o p 且 指 定 一 个 标 识 符 , 所 有 存 储 在 堆 栈 中 的 值 将 从 栈 中 删 除 , 直 到 找
到 一 个 匹 配 的 标 识 符 , 这 个 与 标 识 符 相 关 的 紧 凑 值 也 从 栈 中 移 出 , 并 且 这 个 仅 在
标 识 符 入 栈 之 前 存 在 的 紧 凑 值 成 为 新 的 紧 凑 值 。 如 果 未 找 到 匹 配 的 标 识 符 , 将 使
用 命 令 行 设 置 的 紧 凑 值 , 并 且 将 产 生 一 个 一 级 警 告 。 缺 省 紧 凑 对 齐 为 8 。
p a c k 编 译 指 示 的 新 的 增 强 功 能 让 你 编 写 头 文 件 , 确 保 在 遇 到 该 头 文 件 的 前 后 的
紧 凑 值 是 一 样 的 。
/ * F i l e n a m e : i n c l u d e 1 . h
* /
# p r a g m a p a c k ( p u s h , e n t e r _ i n c l u d e 1 )
/ * 你 的 包 括 文 件 代 码 . . . * /
# p r a g m a p a c k ( p o p , e n t e r _ i n c l u d e 1 )
/ * i n c l u d e 1 . h 结 束 * /
在 上 面 的 例 子 中 , 当 前 紧 凑 值 与 标 识 符 e n t e r _ i n c l u d e 1 联 系 起 来 , 并 被 压 入 头 文
件 的 项 中 。 头 文 件 末 尾 的 p a c k 编 译 指 示 删 除 所 有 可 能 出 现 在 头 文 件 中 的 干 预 紧
凑 值 , 并 且 删 除 与 e n t e r _ i n c l u d e 1 相 关 的 紧 凑 值 。 因 此 确 保 该 头 文 件 的 前 后 的
紧 凑 值 是 相 同 的 。
这 种 新 功 能 也 允 许 你 使 用 代 码 , 例 如 头 文 件 , 它 可 以 使 用 p a c k 编 译 指 示 设 置 不 同
于 在 你 的 代 码 中 设 置 的 紧 凑 值 的 紧 凑 对 齐 :
# p r a g m a p a c k ( p u s h , b e f o r e _ i n c l u d e 1 )
# i n c l u d e " i n c l u d e 1 . h "
# p r a g m a p a c k ( p o p , b e f o r e _ i n c l u d e 1 )
在 上 面 的 例 子 中 , 对 于 出 现 在 i n c l u d e . h 中 的 紧 凑 值 的 任 何 变 化 , 你 的 代 码 是 受
到 保 护 的 。
s e t l o c a l e
# p r a g m a s e t l o c a l e ( " l o c a l e _ s t r i n g " )
该 指 令 在 翻 译 宽 字 符 常 量 和 字 符 串 文 字 时 定 义 其 场 所 ( 国 家 和 语 言 ) 。 由 于 用 于
转 换 多 字 节 字 符 为 宽 位 字 符 的 算 法 可 能 由 于 场 所 或 编 译 而 不 同 , 该 执 行 文 件 在 不
同 的 场 所 运 行 也 可 能 不 同 。 这 个 编 译 指 示 提 供 了 在 编 译 时 给 出 目 标 场 所 的 方 法 。
这 保 证 了 宽 字 符 串 以 正 确 的 格 式 进 行 存 储 。缺 省 的 l o c a l e
_ _
s t r i n g ( 场 所 字 符 串 )
是 “ C ”。“ C ” 场 所 将 每 个 该 串 中 的 字 符 映 射 为 一 个 w c h a r _ t ( u n s i g n e d s h o r t )
型 的 值 。
w a r n i n g
# p r a g m a w a r n i n g ( w a r n i n g - s p e c i f i e r : w a r n i n g - n u m b e r - l i s t
[ , w a r n i n g - s p e c i f i e r : w a r n i n g - n u m b e r - l i s t . . . ] )
# p r a g m a w a r n i n g ( p u s h [ , n ] )
# p r a g m a w a r n i n g ( p o p )
该 指 令 允 许 选 择 性 地 改 变 编 译 器 的 警 告 消 息 。
w a r n i n g - s p e c i f i e r 可 以 是 如 下 值 之 一 :
警 告 指 示 符 含 义
o n c e 只 显 示 一 次 指 定 的 消 息
d e f a u l t 将 缺 省 的 编 译 器 行 为 应 用 于 指 定 的 消 息
1 , 2 , 3 , 4 把 给 定 的 警 告 级 应 用 于 指 定 的 警 告 消 息
d i s a b l e 不 发 出 指 定 警 告 消 息
e r r o r 作 为 错 误 报 告 指 定 的 警 告
w a r n i n g - n u m b e r - l i s t ( 警 告 编 号 表 ) 可 以 包 含 任 何 警 告 编 号 。 在 相 同 的 编 译 指 示 指
令 中 可 指 定 多 个 选 项 如 下 :
# p r a g m a w a r n i n g ( d i s a b l e : 4 5 0 7 3 4 ; o n c e : 4 3 8 5 ; e r r o r : 1 6 4 )
其 功 能 想 当 于 :
# p r a g m a w a r n i n g ( d i s a b l e : 4 5 0 7 3 4 ) / / 禁 止 警 告 消 息 4 5 0 7 和 3 4 .
# p r a g m a w a r n i n g ( o n c e : 4 3 8 5 ) / / 仅 发 出 警 告 4 3 8 5 一 次
# p r a g m a w a r n i n g ( e r r o r : 1 6 4 ) / / 作 为 一 个 错 误 报 告 警 告 1 6 4
对 于 那 些 与 代 码 生 成 有 关 , 且 大 于 4 6 9 9 的 警 告 编 号 来 说 , 这 个 w a r n i n g 编 译 指 示
仅 当 放 在 函 数 定 义 外 时 有 效 。 如 果 警 告 编 号 大 于 4 6 9 9 或 用 在 函 数 体 内 , 则 忽 略
该 编 译 指 示 。 下 面 的 例 子 指 出 了 禁 止 w a r n i n g 编 译 指 示 的 正 确 位 置 , 且 随 后 恢 复
一 个 代 码 生 成 警 告 消 息 的 产 生 。
i n t a ;
# p r a g m a w a r n i n g ( d i s a b l e : 4 7 0 5 )
v o i d f u n c ( )
{
a ;
}
# p r a g m a w a r n i n g ( d e f a u l t : 4 7 0 5 )
w a r n i n g 编 译 指 示 也 支 持 以 下 语 法 :
# p r a g m a w a r n i n g ( p u s h [ , n ] )
# p r a g m a w a r n i n g ( p o p )
这 里 n 代 表 警 告 级 ( 1 到 4 ) 。
编 译 指 示 w a r n i n g ( p u s h ) 存 储 所 有 警 告 的 当 前 警 告 状 态 。 编 译 指 示
w a r n i n g ( p u s h ,n ) 存 储 所 有 警 告 的 当 前 警 告 状 态 并 设 置 全 局 警 告 级 为 n 。
编 译 指 示 w a r n i n g ( p o p ) 将 上 次 压 入 栈 的 警 告 状 态 弹 出 , p u s h 和 p o p 之 间 警 告 状
态 的 任 何 变 化 都 将 被 取 消 。 考 虑 这 个 例 子 :
# p r a g m a w a r n i n g ( p u s h )
# p r a g m a w a r n i n g ( d i s a b l e : 4 7 0 5 )
# p r a g m a w a r n i n g ( d i s a b l e : 4 7 0 6 )
# p r a g m a w a r n i n g ( d i s a b l e : 4 7 0 7 )
/ / 某 些 代 码
# p r a g m a w a r n i n g ( p o p )
在 这 段 代 码 的 未 尾 , p o p 恢 复 所 有 警 告 状 态 ( 包 括 4 7 0 5 、 4 7 0 6 和 4 7 0 7 ) 为 它 在 代
码 起 始 处 的 警 告 状 态 。
当 你 编 写 头 文 件 时 , 可 以 用 p u s h 和 p o p 以 确 保 对 于 用 户 造 成 的 警 告 状 态 的 变 化 ,
不 会 影 响 头 部 的 正 确 编 译 。 通 常 在 头 部 的 起 始 处 使 用 p u s h , 在 末 尾 处 使 用 p o p 。
例 如 , 有 一 个 在 警 告 级 4 未 彻 底 编 译 的 头 部 。 以 下 代 码 将 警 告 级 改 为 3 , 然 后 在
头 部 的 未 尾 恢 复 原 来 的 警 告 级 :
# p r a g m a w a r n i n g ( p u s h , 3 )
/ / 说 明 / 定 义
# p r a g m a w a r n i n g ( p o p )