`
huozheleisi
  • 浏览: 1231236 次
文章分类
社区版块
存档分类
最新评论

预处理器指令

 
阅读更多

预 处 理 器 指 令 如 # d e f i n e 和 # i f d e f ,  一 般 被 用 在 不 同 的 运 行 环 境 下 , 使 源 程 序易 于 更 改 和 编 译 。 源 文 件 中 的 指 令 指 示 预 处 理 器 执 行 特 有 的 行 为 。 例 如 , 预 处 理器 可 替 换 文 本 中 的 语 言 符 号 , 将 其 它 的 文 件 内 容 插 入 源 文 件 中 , 或 移 走 文 本 的 一部 分 以 抑 制 文 件 中 某 部 分 的 编 译 。 预 处 理 器 行 在 宏 扩 展 之 前 被 识 别 且 执 行 。 不过 , 如 果 宏 扩 展 看 起 来 象 一 个 预 处 理 器 指 令 , 该 命 令 将 不 能 被 预 处 理 器 识 别 。
除 转 义 序 列 之 外 , 预 处 理 器 语 句 采 用 与 源 文 件 语 句 相 同 的 字 符 集 。 在 预 处 理 器 语句 中 的 字 符 集 和 可 执 行 程 序 的 字 符 集 是 一 样 的 。 预 处 理 器 也 可 识 别 负 字 符 值 。
预 处 理 器 可 识 别 如 下 指 令 :
# d e f i n e

# e r r o r

# i m p o r t

# u n d e f
# e l i f # i f

# i n c l u d e
# e l s e

# i f d e f

# l i n e
# e n d i f

# i f n d e f

# p r a g m a
数 字 符 号 ( # ) 是 包 含 预 处 理 器 指 令 的 行 中 的 第 一 个 非 空 白 字 符 。  空 白 字 符 可 出现 在 数 字 符 号 和 指 令 的 第 一 个 字 母 之 间 。 某 些 指 令 包 含 参 量 和 值 。 指 令 之 后 的任 何 文 本 ( 除 作 为 指 令 一 部 分 的 参 量 或 值 之 外 ) 必 须 放 在 单 行 注 释 分 界 符 ( / / ) 之后 或 注 释 分 界 符 ( / * * / ) 之 间 。
预 处 理 器 指 令 可 出 现 在 源 文 件 的 任 何 地 方 , 但 它 们 仅 用 于 源 文 件 的 剩 余 部 分 。

# d e f i n e 指 令
可 以 用 # d e f i n e 指 令 给 程 序 中 的 常 量 取 一 个 有 意 义 的 名 称 , 其 语 法 的 两 种 形 式 如下 :
语 法
# d e f i n e 标 识 符 语 言 符 号 字 符 串
o p t
# d e f i n e 标 识 符 [ ( 标 识 符
o p t
, . . . , 标 识 符
o p t
) ]  语 言 符 号 字 符 串
o p t
# d e f i n e 指 令 用 语 言 符 号 字 符 串 替 换 源 文 件 中 一 个 标 识 符 的 所 有 出 现 , 标 识 符 仅在 它 形 成 一 个 语 言 符 号 时 被 替 换 ( 参 见 “ M i c r o s o f t V i s u a l C + + 6 . 0 参 考 库 ”的 “ M i c r o s o f t V i s u a l C + + 6 . 0 语 言 参 考 手 册 ” 卷 的 第 1 章 “ 词 法 规 定 ” 中 的“ 语 言 符 号 ” ) 。 例 如 ,  若 标 识 符 出 现 在 一 个 注 释 、 一 个 字 符 串 或 作 为 一 个 长 标识 符 的 一 部 分 之 中 , 它 就 不 被 替 换 。
一 个 不 带 语 言 符 号 字 符 串 的 # d e f i n e 指 令 将 移 走 源 文 件 中 每 次 标 识 符 的 出 现 。
标 识 符 保 留 其 定 义 且 能 用 # d e f i n e d 和 # i f d e f 测 试 。
语 言 符 号 字 符 串 参 量 由 一 系 列 语 言 符 号 组 成 , 如 关 键 字 、 常 量 或 完 整 的 语 句 。 一个 或 多 个 空 白 字 符 可 将 语 言 符 号 字 符 串 和 标 识 符 分 开 。 空 白 字 符 不 会 被 认 为 是
被 替 换 文 本 的 一 部 分 , 文 本 最 后 语 言 符 号 之 后 的 空 白 也 不 会 认 为 是 替 换 文 本 的 一部 分 。
形 式 参 数 名 称 出 现 在 语 言 符 号 字 符 串 中 以 标 志 出 实 际 值 被 替 换 的 位 置 ,  每 个 参数 名 称 可 在 语 言 符 号 字 符 串 中 出 现 多 次 , 且 可 以 以 任 何 次 序 出 现 。 调 用 时 参 量 的数 目 必 须 与 宏 定 义 的 参 数 数 目 相 匹 配 。 圆 括 号 的 自 由 运 用 可 确 保 正 确 地 说 明 复杂 的 实 际 参 量 。

用 第 二 种 语 法 形 式 可 创 建 类 似 函 数 的 宏 。 这 种 形 式 接 受 一 个 用 圆 括 号 括 起 的 可选 参 数 表 。 在 最 初 定 义 之 后 引 用 该 标 识 符 , 可 以 使 用 实 际 参 量 替 代 形 式 参 数 的 语言 符 号 字 符 串 参 量 的 形 式 , 来 替 换 标 识 符 ( 标 识 符
o p t
, . . . , 标 识 符
o p t
) 的 每 次 出现 。
表 中 的 形 式 参 数 必 须 用 逗 号 隔 开 。 该 表 中 的 每 个 名 称 都 必 须 是 唯 一 的 , 且 此 参 量表 必 须 包 括 在 圆 括 号 中 , 标 识 符 和 左 边 的 圆 括 号 之 间 不 能 有 空 格 。 对 于 占 用 多 行的 长 指 令 可 使 用 行 连 接 , 把 反 斜 杠 ( \ ) 放 在 换 行 符 前 。  形 式 参 数 名 称 的 范 围 延 伸到 结 束 语 言 符 号 字 符 串 的 换 行 符 。
当 一 个 宏 以 第 二 种 语 法 形 式 定 义 时 , 参 量 表 后 的 文 本 实 例 就 构 成 一 个 宏 调 用 。 在源 文 件 中 , 一 个 标 识 符 实 例 后 的 实 际 参 量 必 须 与 宏 定 义 的 相 应 形 式 参 数 匹 配 。
每 个 语 言 符 号 字 符 串 之 前 无 字 符 串 化 ( # ) 、 字 符 化 ( # @ ) 或 语 言 符 号 粘 贴 ( # # ) 操 作符 , 或 其 后 无 # # 操 作 符 的 形 式 参 量 , 都 被 相 应 的 实 际 参 量 所 替 换 。 在 指 令 替 换 形式 参 数 之 前 , 实 际 参 量 中 的 任 何 宏 都 将 被 扩 展 ( 本 章 之 后 的 “ 预 处 理 器 操 作 符 ”中 将 介 绍 这 些 操 作 符 ) 。
以 下 带 参 量 宏 的 例 子 说 明 了 # d e f i n e 语 法 的 第 二 种 形 式 :
/ / 定 义 光 标 行 的 宏
# d e f i n e C U R S O R ( t o p , b o t t o m ) ( ( t o p ) < < 8 ) | b o t t o m ) )
/ / 获 取 指 定 范 围 中 的 一 个 随 机 整 数 的 宏
# d e f i n e g e t r a n d o m ( m i n , m a x ) \
( ( r a n d ( ) % ( i n t ) ( ( ( m a x ) + 1 ) - ( m i n ) ) ) + ( m i n ) )
有 副 作 用 的 参 量 有 时 会 导 致 宏 产 生 不 希 望 的 结 果 。 一 个 给 定 的 形 式 参 量 在 语 言符 号 字 符 串 中 可 能 出 现 多 次 。 如 果 该 形 式 参 数 被 一 个 有 副 作 用 的 表 达 式 所 替 换 ,则 该 表 达 式 及 其 副 作 用 , 可 能 被 求 值 多 次 ( 参 见 本 章 后 面 “ 语 言 符 号 粘 贴 操 作 符# # ” 中 的 例 子 ) 。
# u n d e f 指 令 可 使 一 个 标 识 符 的 预 处 理 器 定 义 失 效 。 有 关 的 更 多 信 息 参 见 # u n d e f指 令 。 若 一 个 被 定 义 的 宏 名 称 出 现 在 语 言 符 号 字 符 串 中 ( 即 使 是 另 一 个 宏 扩 展 的结 果 ) , 它 将 不 被 扩 展 。
除 非 第 二 次 定 义 ( # d e f i n e ) 宏 与 原 定 义 完 全 相 同 , 否 则 重 定 义 一 个 已 定 义 过 的宏 将 产 生 一 个 错 误 信 息 。
M i c r o s o f t 特 殊 处 →
M i c r o s o f t C / C + + 允 许 一 个 宏 的 重 定 义 , 但 会 产 生 一 个 警 告 信 息 , 说 明 新 的 定 义 与原 定 义 相 同 。 A N S I C 认 为 宏 的 重 定 义 是 错 误 的 。 例 如 , 下 面 的 宏 对 C / C + + 是 相 同
的 , 但 会 产 生 一 个 警 告 信 息 :
# d e f i n e t e s t ( f 1 , f 2 ) ( f 1 * f 2 )
# d e f i n e t e s t ( a 1 , a 2 ) ( a 1 * a 2 )
M i c r o s o f t 特 殊 处 结 束
这 个 例 子 用 于 说 明 # d e f i n e 指 令 :
# d e f i n e W I D T H 8 0
# d e f i n e L E N G T H ( W I D T H + 1 0 )
第 一 个 说 明 定 义 标 识 符 W I D T H 为 整 形 常 量 8 0 , 且 用 W I D T H 和 整 形 常 量 1 0 定 义L E N G T H 。 L E N G T H 的 每 次 出 现 都 用 ( W I D T H + 1 0 ) 所 替 换 , 接 着 , W I D T H + 1 0 的 每 次 出 现都 用 表 达 式 ( 8 0 + 1 0 ) 替 换 。 W I D T H + 1 0 的 圆 括 号 非 常 重 要 , 因 为 它 们 决 定 着 如 下 语句 的 解 释 。

v a r = L E N G T H * 2 0 ;
经 预 处 理 后 该 语 句 变 为 :
v a r = ( 8 0 + 1 0 ) * 2 0 ;
求 得 值 为 1 8 0 0 , 若 无 括 号 , 结 果 为 :
v a r = 8 0 + 1 0 * 2 0
其 值 为 2 8 0 。
M i c r o s o f t 特 殊 处 →
在 文 件 开 头 用 / D 编 译 器 选 项 定 义 宏 和 常 量 , 和 用 一 个 # d e f i n e 预 处 理 指 令 效 果 是一 样 的 。 能 用 / D 选 项 定 义 的 宏 可 达 3 0 个 。
M i c r o s o f t 特 殊 处 结 束
# e r r o r 指 令
采 用 e r r o r 指 令 可 产 生 编 译 错 误 信 息 。
语 法
# e r r o r 语 言 符 号 字 符 串
错 误 消 息 包 括 语 言 符 号 字 符 串 参 量 , 且 从 属 于 宏 扩 展 。 这 些 指 令 对 于 检 测 程 序 的前 后 矛 盾 和 预 处 理 时 的 违 犯 约 束 是 非 常 有 用 的 , 以 下 例 子 说 明 了 预 处 理 时 的 出 错处 理 :
# i f ! d e f i n e d ( _ _ c p l u s p l u s )
# e r r o r C + + c o m p l i e r r e q u i r e d .
# e n d i f
当 遇 到 # e r r o r 指 令 时 , 编 译 终 止 。

# i f , # e l i f , # e l s e 和 # e n d i f 指 令
# i f 、 # e l i f 、 # e l s e 和 # e n d i f 指 令 控 制 源 文 件 中 某 部 分 的 编 译 。 如 果 表 达 式 ( # i f之 后 ) 有 一 个 非 0 值 , 则 紧 跟 在 # i f 指 令 之 后 的 行 组 将 保 留 在 转 换 单 元 中 。
语 法
条 件 的 :
i f 部 分 e l i f 部 分
o p t
e l s e 部 分
o p t
e n d i f 行
i f 部 分 :
i f 行 文 本
i f 行 :
# i f 常 量 表 达 式
# i f d e f 标 识 符
# i f n d e f 标 识 符
e l i f 部 分 :
e l i f 行 文 本
e l i f 部 分 e l i f 行 文 本
e l i f 行 :
# e l i f 常 量 表 达 式
e l s e 部 分 :
e l s e 行 文 本
e l s e 行 :
# e l s e

e n d i f 行 :
# e n d i f
源 文 件 中 每 个 # i f 指 令 都 必 须 与 最 近 的 一 个 # e n d i f 相 匹 配 。 在 # i f 和 # e n d i f 指令 之 前 的 # e l i f 指 令 的 数 目 是 不 限 的 , 但 最 多 只 能 有 一 个 # e l s e 指 令 。 # e l s e 必须 是 # e n d i f 之 前 的 最 后 一 个 指 令 。
# i f 、 # e l i f 、 # e l s e 和 # e n d i f 指 令 可 嵌 套 在 其 它 # i f 指 令 的 文 本 部 分 。 每 个 嵌套 的 # e l s e 、 # e l i f 或 # e n d i f 指 令 应 属 于 前 面 最 近 的 一 个 # i f 指 令 。
所 有 的 条 件 编 译 指 令 , 如 # i f 和 # i f d e f , 必 须 与 文 件 结 束 前 最 近 的 # e n d i f 指 令 匹配 ; 否 则 , 将 产 生 一 个 错 误 消 息 。 当 条 件 编 译 指 令 包 括 在 包 含 文 件 中 时 , 他 们 必 须满 足 相 同 的 条 件 : 在 包 含 文 件 结 尾 没 有 不 匹 配 的 条 件 编 译 指 令 。
宏 替 换 应 在 # e l i f 命 令 后 的 命 令 行 部 分 内 进 行 , 因 此 一 个 宏 调 用 可 用 在 常 量 表 达式 中 。
预 处 理 器 选 择 一 个 给 定 文 本 的 出 现 之 一 作 进 一 步 的 处 理 。 文 本 中 指 定 的 一 个 块可 以 是 文 本 的 任 何 序 列 。 它 可 能 占 用 一 行 以 上 。 通 常 该 文 本 是 对 于 编 译 和 预 处理 器 有 意 义 的 程 序 文 本 。
预 处 理 器 处 理 选 择 文 本 并 将 其 传 送 给 编 译 器 。 若 该 文 本 包 含 预 处 理 器 指 令 , 预 处理 器 将 执 行 这 些 指 令 。 编 译 器 只 编 译 预 处 理 器 选 定 的 文 本 块 。
预 处 理 器 通 过 求 值 每 个 # i f 或 # e l i f 指 令 之 后 的 常 量 表 达 式 直 到 找 到 一 个 为 真( 非 0 ) 的 常 量 表 达 式 来 选 择 单 个 文 本 项 。 预 处 理 器 选 择 所 有 的 文 本 ( 包 括 以 # 开头 的 其 它 预 处 理 器 指 令 ) 直 到 它 关 联 的 # e l i f 、 # e l s e 或 # e n d i f 。
如 果 常 量 表 达 式 的 所 有 出 现 都 为 假 , 或 者 如 果 没 有 # e l i f 指 令 , 预 处 理 器 将 选 择# e l s e 后 的 文 本 块 。 如 果 # e l s e 被 忽 略 , 且 所 有 # i f 块 中 的 常 量 表 达 式 都 为 假 ,则 不 选 择 任 何 文 本 块 。
常 量 表 达 式 是 一 个 有 以 下 额 外 限 制 的 整 型 常 量 表 达 式 :
z 表 达 式 必 须 是 整 型 且 可 以 包 括 整 型 常 量 , 字 符 常 量 和 d e f i n e d 操 作符 。
z 表 达 式 不 能 使 用 s i z e o f 或 一 个 类 型 造 型 操 作 符 。
z 目 标 环 境 不 能 表 示 整 数 的 所 有 范 围 。
z 在 翻 译 表 示 中 , i n t 类 型 和 l o n g 类 型 以 及 u n s i g n e d i n t 类 型 和u n s i g n e d l o n g 类 型 是 相 同 的 。
z 翻 译 器 可 将 字 符 常 量 翻 译 成 一 组 不 同 于 目 标 环 境 的 代 码 值 。 为 了 确定 目 标 环 境 的 属 性 , 应 在 为 目 标 环 境 建 立 的 应 用 程 序 中 检 测
L I M I T S . H 的 宏 值 。
z 表 达 式 不 需 执 行 所 有 的 环 境 查 询 , 但 需 与 目 标 计 算 机 的 执 行 过 程 细节 隔 离 开 。
预 处 理 器 操 作 符 d e f i n e d 可 用 于 特 殊 的 常 量 表 达 式 , 语 法 如 下 :
语 法
d e f i n e d ( 标 识 符 )
d e f i n e d 标 识 符
若 此 标 识 符 当 前 已 定 义 , 则 该 常 量 表 达 式 被 认 为 是 真 ( 非 0 ) ; 否 则 , 条 件 为 假 ( 0 ) 。
一 个 定 义 为 空 文 本 的 标 识 符 可 认 为 已 定 义 。 d e f i n e d 指 令 只 能 用 于 # i f 和 # e n d i f指 令 。
在 如 下 例 子 中 , # i f 和 # e n d i f 指 令 控 制 着 三 个 函 数 调 用 中 某 一 个 的 编 译 :
# i f d e f i n e d ( C R E D I T )

c r e d i t ( ) ;
# e l i f d e f i n e d ( D E B I T )
d e b i t ( ) ;
# e l s e
p r i n t e r r o r ( ) ;
# e n d i f
若 标 识 符 C R E D I T 已 定 义 , 则 对 于 c r e d i t 的 函 数 调 用 被 编 译 。 若 标 识 符 D E B I T 被定 义 , 则 对 于 d e b i t 的 函 数 调 用 被 编 译 。 若 未 定 义 任 何 标 识 符 ,  将 编 译 对 于p r i n t e r r o r 的 函 数 调 用 。注 意 , 在 C 和 C + + 中 , C R E D I T 和 c r e d i t 是 不 同 的 标 识 符 , 因 为 它 们 的 大 小 写 不 一样 。
如 下 例 子 中 的 条 件 编 译 语 句 给 出 了 一 个 名 称 为 D L E V E L 的 已 定 义 的 符 号 常 量 :
# i f D L E V E L > 5
# d e f i n e S I G N A L 1
# i f S T A C K U S E = = 1
# d e f i n e S T A C K 2 0 0
# e l s e
# d e f i n e S T A C K 1 0 0
# e n d i f
# e l s e
# d e f i n e S I G N A L 0
# i f S T A C K U S E = = 1

# d e f i n e S T A C K 1 0 0
# e l s e
# d e f i n e S T A C K 5 0
# e n d i f
# e n d i f
# i f D L E V E L = = 0
# d e f i n e S T A C K 0
# e l i f D L E V E L = = 1
# d e f i n e S T A C K 1 0 0
# e l i f D L E V E L > 5
d i s p l a y ( d e b u g p t r ) ;
# e l s e
# d e f i n e S T A C K 2 0 0
# e n d i f
第 一 个 # i f 块 中 有 两 组 嵌 套 的 # i f 、 # e l s e 和 # e n d i f 指 令 。 第 一 组 指 令 仅 当D L E V E L l > 5 为 真 时 执 行 ; 否 则 , 执 行 # e l s e 之 后 的 语 句 。
第 二 组 中 的 # e l i f 和 # e l s e 指 令 选 择 基 于 D L E V E L 值 的 四 个 选 项 之 一 。 常 量 S T A C K依 据 D L E V E L 定 义 为 0 , 1 0 0 或 2 0 0 。 若 D L E V E L 大 于 5 , 则 编 译 语 句 :
# e l i f D L E V E L > 5
d i s p l a y ( d e b u g p t r ) ;
且 此 时 不 定 义 S T A C K 。
条 件 编 译 一 般 用 于 防 止 同 一 头 文 件 的 多 重 包 含 。 C + +  中 在 头 文 件 内 经 常 定 义 类的 位 置 , 可 使 用 如 下 结 构 来 防 止 多 次 定 义 。
/ / E X A M P L E . H 例 子 头 文 件
# i f ! d e f i n e d ( E X A M P L E _ H )
# d e f i n e E x a m p l e E _ H
c l a s s E x a m p l e
{
. . .
} ;
# e n d i f / / ! d e f i n e d ( E X A M P L E _ H )
上 面 的 代 码 用 于 检 查 符 号 常 量 E X A M P L E _ H 是 否 已 定 义 。 若 已 定 义 , 该 文 件 就 已 被
包 括 且 不 需 再 处 理 ; 如 果 未 定 义 , 常 量 E X A M P L E _ H 将 被 定 义 , 以 标 记 E X A M P L E . H 为
已 经 处 理 。
M i c r o s o f t 特 殊 处 →
条 件 编 译 表 达 式 被 看 作 为 s i g n e d l o n g 值 , 且 这 些 表 达 式 与 C + + 中 的 表 达 式 采 用
相 同 的 规 则 求 值 。 例 如 , 表 达 式 :
# i f 0 x F F F F F F F F L > 1 U L
为 真 。
M i c r o s o f t 特 殊 处 结 束

# i f d e f 和 i f n d e f 指 令
# i f d e f 和 # i f n d e f 指 令 与 使 用 d e f i n e d ( 标 识 符 ) 操 作 符 的 作 用 是 一 样 的 。
语 法
# i f d e f 标 识 符
# i f n d e f 标 识 符
等 同 于
# i f d e f i n e d 标 识 符
# i f ! d e f i n e d 标 识 符
# i f 指 令 能 用 的 任 何 地 方 都 可 以 用 # i f d e f 和 # i f n d e f 指 令 。 当 标 识 符 已 被 定 义时 , # i f d e f 标 识 符 语 句 等 同 于 # i f 1 ; 而 当 标 识 符 未 定 义 或 用 # u n d e f 指 令 对 其 反定 义 时 , 该 语 句 等 同 于 # i f 0 。 这 些 指 令 仅 用 于 检 查 C 或 C + + 源 代 码 中 是 否 出 现该 标 识 符 , 而 不 是 用 于 检 查 C 或 C + + 源 程 序 中 该 标 识 符 的 说 明 。
提 供 这 几 个 指 令 只 为 了 与 该 语 言 的 老 版 本 兼 容 。 目 前 的 趋 势 是 偏 向 于 采 用d e f i n e d ( 标 识 符 ) 定 义 常 量 表 达 式 的 # i f 指 令 。
# i f n d e f 指 令 测 试 与 # i f d e f 相 反 的 条 件 。 若 标 识 符 未 定 义 ( 或 已 用 # u n d e f 反 定义 ) , 其 条 件 为 真 ( 非 0 ) ; 反 之 , 条 件 为 假 ( 0 ) 。
M i c r o s o f t 特 殊 处 →
可 以 使 用 / D 选 项 从 命 令 行 传 送 标 识 符 , 采 用 / D 选 项 至 多 可 以 指 定 3 0 个 宏 。
检 查 一 个 定 义 是 否 存 在 是 非 常 有 用 的 , 因 为 定 义 可 从 命 令 行 传 送 。 例 如 :
/ / p r o g . c p p
# i f n d e f t e s t / / 这 三 个 语 句 放 在 你 的 代 码 中

# d e f i n e f i n a l
# e n d i f
C L / D t e s t p r o g . c p p / / 这 是 编 译 的 命 令
M i c r o s o f t 特 殊 处 结 束
# i m p o r t 指 令
C + + 特 殊 处 →
# i m p o r t 指 令 用 于 从 一 个 类 型 库 中 结 合 信 息 。 该 类 型 库 的 内 容 被 转 换 为 C + + 类 ,
主 要 用 于 描 述 C O M 界 面 。
语 法
# i m p o r t " 文 件 名 " [ 属 性 ]
# i m p o r t < 文 件 名 > [ 属 性 ]
属 性 :
属 性 1 , 属 性 2 , . . .
属 性 1 属 性 2 . . .
文 件 名 是 一 个 包 含 类 型 库 信 息 的 文 件 的 名 称 。 一 个 文 件 可 为 如 下 类 型 之 一 :
z 一 个 类 型 库 ( . T L B 或 . O D L ) 文 件 。
z 一 个 可 执 行 ( . E X E ) 文 件 。
z 一 个 包 含 类 型 库 资 源 ( 如 . O C X ) 的 库 文 件 ( . D L L ) 。
z 一 个 包 含 类 型 库 的 复 合 文 档 。
z 其 它 可 被 L o a d T y p e L i b A P I 支 持 的 文 件 格 式 。

文 件 名 之 前 可 以 有 一 个 目 录 规 格 。 文 件 名 必 须 是 一 个 已 存 在 文 件 的 名 称 。  两 种
格 式 的 区 别 是 当 路 径 未 完 全 说 明 时 , 预 处 理 器 检 索 类 型 库 文 件 的 顺 序 不 同 。
语 法 格 式
动 作
引 号 格 式 这 种 格 式 让 预 处 理 器 首 先 搜 索 与 包 含 # i m p o r t 语 句 的 文 件
同 一 目 录 的 类 型 库 文 件 , 然 后 在 所 有 包 括 ( # i n c l u d e ) 该 文
件 的 目 录 中 搜 索 , 最 后 在 如 下 路 径 中 搜 索
尖 括 号 格 式 这 种 格 式 指 示 预 处 理 器 沿 以 下 路 径 搜 索 类 型 库 文 件
编 译 器 在 以 下 目 录 中 搜 索 已 命 名 的 文 件 :
1 . P A T H 环 境 变 量 路 径 表 。
2 . L I B 环 境 变 量 路 径 表 。
3 . 用 / I ( 额 外 的 包 括 目 录 ) 编 译 器 选 项 指 定 的 路 径 。
# i m p o r t 可 以 任 选 地 包 含 一 个 或 多 个 属 性 。 这 些 属 性 使 编 译 器 改 变 类 型 库 头 文
件 的 内 容 。 一 个 反 斜 杠 ( \ ) 符 可 用 在 一 个 单 一 的 # i m p o r t 语 句 中 包 含 额 外 的 行 ,
例 如 :
# i m p o r t " t e s t . l i b " n o _ n a m e s p a c e \
r e n a m e ( " O l d N a m e " , " N e w N a m e " )
# i m p o r t 属 性 列 出 如 下 :
e x c l u d e h i g h _ m e t h o d _ p r e f i x
h i g h _ p r o p e r t y _ p r e f i x e s i m p l e m e n t a t i o n _ o n l y
i n c l u d e ( . . . ) i n j e c t _ s t a t e m e n t
n a m e d _ g u i d s n o _ a u t o _ e x c l u d e

n o _ i m p l e m e n t a t i o n n o _ n a m e s p a c e
r a w _ d i s p i n t e r f a c e s r a w _ i n t e r f a c e s _ o n l y
r a w _ m e t h o d _ p r e f i x r a w _ n a t i v e _ t y p e s
r a w _ p r o p e r t y _ p r e f i x e s r e n a m e
r e n a m e _ n a m e s p a c e
# i m p o r t 指 令 可 创 建 两 个 在 C + + 源 代 码 中 重 构 类 型 库 内 容 的 头 文 件 , 第 一 个 头 文
件 和 用 M i c r o s o f t 接 口 定 义 语 言 ( M I D L ) 编 译 器 生 成 的 头 文 件 类 似 , 但 有 额 外 的 编
译 器 生 成 代 码 和 数 据 。 第 一 个 头 文 件 与 类 型 库 有 相 同 的 基 本 名 , 其 扩 展 名
为 . T L H 。 第 二 个 头 文 件 也 有 与 类 型 库 相 同 的 基 本 名 , 其 扩 展 名 为 . T L I 。 它 包 括 了
编 译 器 生 成 成 员 函 数 的 实 现 , 且 被 包 含 在 ( # i n c l u d e ) 的 第 一 个 头 文 件 内 。
两 个 头 文 件 都 在 用 / F o ( 命 名 对 象 文 件 ) 选 项 指 定 的 输 出 目 录 中 。 随 后 它 们 被 读 出
和 编 译 , 就 像 第 一 个 头 文 件 被 # i n c l u d e 指 令 命 名 一 样 。
以 下 是 伴 随 # i m p o r t 指 令 的 编 译 器 优 化 :
z 头 文 件 被 创 建 时 , 将 被 分 配 与 类 库 相 同 的 时 间 标 志 。
z 处 理 # i m p o r t 时 , 编 译 器 首 先 测 试 头 文 件 是 否 存 在 , 是 否 过 期 。 若 条
件 为 真 , 就 不 需 重 新 创 建 。
z 编 译 器 延 迟 对 于 O L E 子 系 统 的 初 始 化 , 直 到 碰 到 第 一 个 # i m p o r t 命
令 。
# i m p o r t 指 令 也 可 参 与 最 小 重 建 且 可 被 置 于 一 个 预 编 译 头 文 件 中 。

基 本 类 型 库 头 文 件
基 本 类 型 库 头 文 件 由 七 个 部 分 组 成 :
1 . 头 部 固 定 正 文 : 由 注 释 、 C O M D E F . H ( 定 义 用 在 头 部 的 一 些 标 准 宏 ) 的 # i n c l u d e
语 句 和 其 它 繁 杂 的 安 装 信 息 组 成 。
2 . 前 向 引 用 和 类 型 定 义 : 由 象 s t r u c t I M y i n t e r f a c e 之 类 的 结 构 说 明 和 用 于 一 些
T K I N D _ A L I A S 项 的 类 型 定 义 组 成 。
3 . 灵 敏 指 针 说 明 : 模 块 类 _ c o m _ p t r _ t 是 一 个 封 装 接 口 指 针 和 消 除 调 用 A d d R e f 、
R e l e a s e 和 Q u e r y I n t e r f a c e 函 数 需 求 的 灵 敏 指 针 实 现 。 此 外 , 它 隐 藏 了 创 建 一
个 新 C O M 对 象 中 的 C o C r e a t e I n s t a n c e 调 用 。 此 部 分 采 用 宏 语 句
_ C O M _ S M A R T P T R _ T Y P E D E F 将 C O M 接 口 的 类 型 定 义 创 建 为 _ c o m _ p t r _ t 模 板 类 的 模
板 特 例 化 。 例 如 , 对 于 界 面 I F o o , . T L H 文 件 包 含 有 :
_ C O M _ S M A R T P T R _ T Y P E D E F ( I F o o ,
_ _
u u i d o f ( I F o o ) ) ;
编 译 器 将 其 扩 展 为 :
t y p e d e f _ c o m _ p t r _ t < _ c o m _ I I I D < I F o o , _ _ u u i d o f ( I F o o ) > > I F o o P t r ;
类 型 I F o o P t r 可 以 用 在 原 始 的 界 面 指 针 I F o o * 的 地 方 。 结 果 , 就 不 需 调 用 各 种
I U n k n o w n 成 员 函 数 。
4 . 类 型 信 息 ( t y p e i n f o ) 说 明 : 主 要 由 类 定 义 和 其 它 项 组 成 , 这 些 项 说 明 由
I T y p t L i b : G e t T y p e I n f o 返 回 的 单 个 的 信 息 类 型 项 目 。 在 这 部 分 , 每 个 来 自 于 类
型 库 的 信 息 类 型 都 以 一 种 依 赖 于 T Y P E K I N D 信 息 的 格 式 反 映 在 该 头 部 。
5 . 任 选 旧 式 G U I D 定 义 : 包 含 命 名 的 G U I D 常 量 的 初 始 化 过 程 , 这 些 定 义 是 格 式
C L S I D _ C o C l a s s 和 I I D _ I n t e r f a c e 的 名 称 , 与 那 些 由 M I D L 编 译 器 产 生 的 类 似 。

6 . 用 于 第 二 个 类 型 库 头 部 的 # i n c l u d e 语 句 。
7 . 结 尾 固 定 正 文 : 目 前 包 括 # p r a g m a p a c k ( p o p ) 。
以 上 这 些 部 分 除 头 部 固 定 正 文 和 结 尾 固 定 正 文 部 分 之 外 , 都 被 包 括 在 原 来 的 I D L
文 件 中 以 l i b r a r y 语 句 指 定 其 名 称 的 名 称 空 间 中 。 你 可 以 通 过 用 名 称 空 间 显 式
限 定 或 包 括 如 下 语 句 从 类 型 库 头 部 使 用 该 名 称 。
u s i n g n a m e s p a c e M y L i b
在 源 代 码 的 # i m p o r t 语 句 之 后 立 即
名 称 空 间 可 用 # i m p o r t 指 令 的 n o _ n a m e s p a c e 属 性 来 阻 止 。 但 阻 止 的 名 称 空 间 可
能 导 致 名 称 冲 突 。 名 称 空 间 也 可 用 r e n a m e _ n a m e s p a c e 属 性 重 新 换 名 。
编 译 器 提 供 完 全 路 径 给 需 要 依 赖 当 前 正 在 处 理 的 类 型 库 的 任 何 类 型 库 。 路 径 以
注 释 格 式 写 入 到 由 编 译 器 为 每 个 处 理 的 类 型 库 生 成 的 类 型 库 头 部 ( . T L H ) 。
如 果 一 个 类 型 库 包 含 了 对 其 它 类 型 库 定 义 的 类 型 引 用 , . T L H 文 件 将 包 括 以 下 注
释 :
/ /
/ / C r o s s - r e f e r e n c e d t y p e l i b r a r i e s :
/ /
/ / # i m p o r t " c : \ p a t h \ t y p e l i b 0 . t l b "
/ /
在 # i m p o r t 注 释 中 的 实 际 文 件 名 是 存 储 在 寄 存 器 中 交 叉 引 用 的 类 型 库 全 路 径 。
如 果 你 遇 到 由 于 省 略 类 型 定 义 的 错 误 时 , 检 查 . T L H 头 部 的 注 释 , 看 哪 一 种 依 赖 类
型 库 需 要 先 输 入 。 在 编 译 该 . T L I 文 件 时 可 能 的 错 误 有 语 法 错 误 ( 例 如
C 2 1 4 3 , C 2 1 4 6 , C 2 3 2 1 ) 、 C 2 5 0 1 ( 缺 少 说 明 指 示 符 ) 或 C 2 4 3 3 ( 在 数 据 说 明 中 禁 止 ′i n l i n e ′ ) 。
你 必 须 确 定 哪 些 依 赖 注 释 是 不 被 系 统 头 部 给 出 的 , 而 是 在 依 赖 类 型 库 的 # i m p o r t
指 令 前 的 某 处 给 出 一 个 # i m p o r t 指 令 以 消 除 这 些 错 误 。
e x c l u d e 属 性
e x c l u d e ( “ 称 1 ” [ , “ 名 称 2 ” , . . . ] )
名 称 1
被 排 斥 的 第 一 个 项
名 称 2
被 排 斥 的 第 二 个 项 ( 如 有 必 要 )
类 型 库 可 能 包 含 在 系 统 头 部 或 其 它 类 型 库 内 定 义 的 项 的 定 义 。 该 属 性 可 用 于 从
生 成 的 类 型 库 头 文 件 中 排 斥 这 些 项 。 这 个 属 性 可 带 任 意 数 目 的 参 量 , 每 个 参 量 是
一 个 被 排 斥 的 高 级 类 型 库 项 目 :
h i g h _ m e t h o d _ p r e f i x 属 性
h i g h _ m e t h o d _ p r e f i x ( " P r e f i x " )
P r e f i x
被 使 用 的 前 缀
在 缺 省 的 情 况 下 , 高 级 错 误 处 理 属 性 和 方 法 用 一 个 无 前 缀 命 名 的 成 员 函 数 来 展
示 。 这 个 名 称 来 自 于 类 型 库 。 h i g h _ m e t h o d _ p r e f i x 属 性 说 明 一 个 前 缀 以 用 于 命
名 这 些 高 级 属 性 和 方 法 。

h i g h _ p r o p e r t y _ p r e f i x e s 属 性
h i g h _ p r o p e r t y _ p r e f i x e s ( " G e t P r e f i x , " " P u t P r e f i x , " " P u t R e f P r e f i x " )
G e t P r e f i x
用 于 p r o p g e t 方 法 的 前 缀
P u t P r e f i x
用 于 p r o p p u t 方 法 的 前 缀
P u t R e f P r e f i x
用 于 p r o p p u t r e f 方 法 的 前 缀
在 缺 省 情 况 下 , 高 级 错 误 处 理 方 法 , 如 p r o p g e t 、 p r o p p u t 和 p r o p p u t r e f , 分 别 采
用 以 前 缀 G e t 、 P u t 和 P u t R e f 命 名 的 成 员 函 数 来 说 明 。 h i g h _ p r o p e r t y _ p r e f i x e s
属 性 用 于 分 别 说 明 这 三 种 属 性 方 法 的 前 缀 。
i m p l e m e n t a t i o n _ o n l y 属 性
i m p l e m e n t a t i o n _ o n l y 属 性 禁 止 . T L H 头 文 件 ( 基 本 头 文 件 ) 的 生 成 。  这 个 文 件 包
括 了 所 有 用 于 展 示 类 型 库 内 容 的 说 明 。 该 . T L I 头 文 件 和 w r a p p e r 成 员 函 数 的 实
现 , 将 被 生 成 且 包 含 在 编 译 过 程 中 。
当 指 定 该 属 性 时 , 该 . T L I 头 部 的 内 容 将 和 用 于 存 放 普 通 . T L H 头 部 的 内 容 放 在 相
同 的 名 称 空 间 。 此 外 , 该 成 员 函 数 不 会 作 为 联 编 说 明 。 i m p l e m e n t a t i o n _ o n l y 属
性 一 般 希 望 与 n o _ i m p l e m e n t a t i o n 属 性 配 对 使 用 , 以 跟 踪 预 编 译 头 文 件 ( P C H ) 之
外 的 实 现 。 一 个 有 n o _ i m p l e m e n t a t i o n 属 性 的 # i m p o r t 语 句 被 置 于 用 来 创 建 p c h
的 源 区 域 中 , 结 果 P C H 将 被 一 些 源 文 件 所 用 。 一 个 带 i m p l e m e n t a t i o n _ o n l y 属 性

的 # i m p o r t 语 句 随 后 被 用 在 P C H 区 域 之 外 。 在 一 个 源 文 件 里 只 需 用 一 次 这 种 语
句 。 这 将 生 成 不 需 对 每 个 源 文 件 进 行 额 外 重 编 译 的 所 有 必 要 的 w r a p p e r 成 员 函
数 。
注 意 : 一 个 # i m p o r t 语 句 中 的 i m p l e m e n t a t i o n _  o n l y 属 性 必 须 和 相 同 类 型 库 中
n o _ i m p l e m e n t a t i o n 属 性 的 另 一 个 # i m p o r t 语 句 配 套 使 用 。 否 则 , 将 产 生 编 译 错
误 。 这 是 因 为 带 n o _ i m p l e m e n t a t i o n 属 性 的 # i m p o r t 语 句 生 成 的 w r a p p e r 类 定
义 需 要 编 译 i m p l e m e n t a t i o n _ o n l y 属 性 生 成 的 语 句 实 现 。
i n c l u d e ( . . . ) 属 性
i n c l u d e ( 名 称 1 [ , 名 称 2 , . . . ] )
名 称 1
第 一 个 被 强 制 包 含 的 项
名 称 2
第 二 个 被 强 制 包 含 的 项 ( 如 果 必 要 )
类 型 库 可 能 包 含 在 系 统 头 部 或 其 它 类 型 库 中 定 义 的 项 的 定 义 。 # i m p o r t 指 令 试
图 用 自 动 排 斥 这 些 项 来 避 免 多 重 定 义 错 误 。 若 这 些 项 已 经 被 排 斥 , 象 警 告 C 4 1 9 2
所 指 出 的 那 样 , 且 它 们 不 应 该 被 排 斥 , 则 这 个 属 性 可 用 于 禁 止 自 动 排 斥 。 该 属 性
可 带 任 意 数 目 的 参 量 , 每 个 参 量 应 是 被 包 括 的 类 型 库 项 的 名 称 。
i n j e c t _ s t a t e m e n t 属 性
i n j e c t _ s t a t e m e n t ( " s o u r c e _ t e x t " )

s o u r c e _ t e x t
被 插 入 到 类 型 库 头 文 件 的 源 文 本 。
i n j e c t _ s t a t e m e n t 属 性 将 其 参 量 作 为 源 文 本 插 入 类 型 库 头 部 。 此 文 本 被 置 于 包
括 头 文 件 中 类 型 库 内 容 的 名 称 空 间 说 明 的 起 始 处 。
n a m e d _ g u i d s 属 性
n a m e d _ g u i d s 属 性 让 编 译 器 定 义 和 初 始 化 模 板 L I B I D _ M y L i b 、 C L S I D _ M y C o C l a s s 、
I I D _ M y I n t e r f a c e 和 D I I D _ M y D i s p I n t e r f a c e 的 旧 式 格 式 的 G U I D 变 量 。
n o _ i m p l e m e n t a t i o n 属 性
该 属 性 阻 止 . T L I 头 文 件 的 生 成 , 这 个 文 件 包 含 w r a p p e r 成 员 函 数 的 实 现 。 如 果
指 定 这 个 属 性 , 则 展 示 类 型 库 项 说 明 的 . T L H 头 将 生 成 没 有 一 个 # i n c l u d e 语 句 包
括 该 . T L I 头 文 件 。
该 属 性 与 i m p l e m e n t a t i o n _ o n l y 属 性 配 套 使 用 。
n o _ a u t o _ e x c l u d e 属 性
类 型 库 可 能 包 括 在 系 统 头 部 或 其 它 类 型 库 中 定 义 的 项 的 定 义 。 # i m p o r t 试 图 通
过 自 动 排 斥 这 些 项 来 避 免 多 重 定 义 错 误 。 当 这 样 做 时 , 每 个 被 排 斥 的 项 都 将 生 成
一 个 C 4 1 9 2 警 告 信 息 。 你 可 禁 止 这 个 属 性 使 用 自 动 排 斥 。

n o _ n a m e s p a c e 属 性
# i m p o r t 头 文 件 中 的 类 型 库 内 容 一 般 定 义 在 一 个 名 称 空 间 里 。 名 称 空 间 的 名 称
在 原 来 I D L 文 件 的 l i b r a r y 语 句 中 指 定 。 如 果 指 定 n o _ n a m e s p a c e 属 性 , 编 译 器
就 不 会 生 成 这 个 名 称 空 间 。
如 果 你 想 使 用 一 个 不 同 的 名 称 空 间 , 应 代 替 使 用 r e n a m e _ n a m e s p a c e 属 性 。
r a w _ d i s p i n t e r f a c e s 属 性
r a w _ d i s p i n t e r f a c e s 属 性 让 编 译 器 生 成 一 个 低 级 w r a p p e r 函 数 。 该 函 数 用 于 调
用 I D i s p a t c h : : I n v o k e 和 返 回 H R E S U L T 错 误 代 码 的 d i s p i n t e r f a c e 方 法 和 属 性 。
如 果 未 指 定 此 属 性 , 则 只 生 成 高 级 w r a p p e r , 它 在 失 败 时 丢 弃 该 C + + 异 常 。
r a w _ i n t e r f a c e s _ o n l y 属 性
r a w _ i n t e r f a c e s _ o n l y 属 性 禁 止 生 成 错 误 处 理 w r a p p e r 函 数 以 及 使 用 这 些
w r a p p e r 函 数 的
_ _
d e c l s p e c ( 属 性 ) 说 明 。
r a w _ i n t e r f a c e s _ o n l y 属 性 也 导 致 删 除 在 命 名 n o n
_ _
p r o p e r t y 函 数 中 的 缺 省 前
缀 。 通 常 该 前 缀 是 r a w _ 。 若 指 定 此 属 性 , 函 数 名 称 将 直 接 从 类 型 库 中 生 成 。
该 属 性 只 允 许 展 示 类 型 库 的 低 级 内 容 。
r a w _ m e t h o d _ p r e f i x 属 性
r a w _ m e t h o d _ p r e f i x ( " P r e f i x " )

P r e f i x
被 使 用 的 前 缀
用 r a w _ 作 为 缺 省 前 缀 的 成 员 函 数 展 示 低 层 属 性 和 方 法 , 以 避 免 与 高 级 错 误 处 理
成 员 函 数 的 名 称 冲 突 。 r a w _ m e t h o d _ p r e f i x 属 性 用 于 指 定 一 个 不 同 的 前 缀 。
注 意 : r a w _ m e t h o d _ p r e f i x 属 性 的 效 果 不 会 因 r a w _ m e t h o d _ p r e f i x 属 性 的 存 在
而 改 变 。 在 说 明 一 个 前 缀 时 , r a w _ m e t h o d _ p r e f i x 总 是 优 先 于
r a w _ i n t e r f a c e s _ o n l y 。 若 两 种 属 性 用 在 同 一 个 # i m p o r t 语 句 中 时 , 则 采 用
r a w _ m e t h o d _ p r e f i x 指 定 的 前 缀 。
r a w _ n a t i v e _ t y p e s 属 性
在 缺 省 情 况 下 , 高 级 错 误 处 理 方 法 在 B S T R 和 V A R I A N T 数 据 类 型 和 原 始 C O M 界 面
指 针 的 地 方 使 用 C O M 支 持 类 _ b c t r _ t 和 _ v a r i a n t _ t 。 这 些 类 封 装 了 分 配 和 取 消
分 配 这 些 数 据 类 型 的 存 储 器 存 储 的 细 节 , 并 且 极 大 地 简 化 了 类 型 造 型 和 转 换 操
作 。 r a w _ n a t i v e _ t y p e s 属 性 在 高 级 w r a p p e r 函 数 中 禁 止 使 用 这 些 C O M 支 持 类 ,
并 强 制 替 换 使 用 低 级 数 据 类 型 。
r a w _ p r o p e r t y _ p r e f i x 属 性
r a w _ p r o p e r t y _ p r e f i x ( " G e t P r e f i x " , " P u t P r e f i x " , " P u t R e f P r e f i x " )
G e t P r e f i x
用 于 p r o p g e t 方 法 的 前 缀
P u t P r e f i x

用 于 p r o p p u t 方 法 的 前 缀
P u t R e f P r e f i x
用 于 p r o p p u t r e f 方 法 的 前 缀
在 缺 省 情 况 下 , 低 级 方 法 p r o p g e t 、 p r o p p u t 和 p r o p p u t r e f 分 别 用 后 缀 为 g e t _ 、
p u t _ 和 p u t r e f _ 的 成 员 函 数 来 展 示 。 这 些 前 缀 与 M I D L 生 成 的 头 文 件 中 的 名 称 是
兼 容 的 。 r a w _ p r o p e r t y _ p r e f i x e s 属 性 分 别 用 于 说 明 这 三 个 属 性 方 法 的 前 缀 。
r e n a m e 属 性
r e n a m e ( " O l d N a m e , " " N e w N a m e " )
O l d N a m e
类 型 库 中 的 旧 名
N e w N a m e
用 于 替 换 旧 名 的 名 称
r e n a m e 属 性 用 于 解 决 名 称 冲 突 的 问 题 。 若 该 属 性 被 指 定 , 编 译 器 将 在 类 型 库 中
的 O l d N a m e 的 所 有 出 现 处 用 结 果 头 文 件 中 用 户 提 供 的 N e w N a m e 替 换 。
此 属 性 用 于 类 型 库 中 的 一 个 名 称 和 系 统 头 文 件 中 的 宏 定 义 重 合 时 。 若 这 种 情 况
未 被 解 决 , 则 将 产 生 大 量 语 法 错 误 , 如 C 2 0 5 9 和 C 2 0 6 1 。
注 意 : 这 种 替 换 用 于 类 型 库 的 名 称 , 而 不 是 用 于 结 果 头 文 件 中 的 名 称 。
这 里 有 一 个 例 子 : 假 设 类 型 库 中 有 一 个 名 称 为 M y P a r e n t 的 属 性 , 且 头 文 件 中 定 义
了 一 个 用 在 # i m p o r t 之 前 的 宏 G e t M y P a r e n t 。 由 于 G e t M y P a r e n t 是 用 于 错 误 处 理
属 性 g e t 的 一 个 w r a p p e r 函 数 的 缺 省 名 称 , 所 以 将 产 生 一 个 名 称 冲 突 。 为 解 决 这
个 问 题 , 使 用 # i m p o r t 语 句 中 的 以 下 属 性 :

r e n a m e ( " M y P a r e n t " , " M y P a r e n t X " )
该 语 句 将 重 新 命 名 类 型 库 中 的 名 称 M y P a r e n t , 而 试 图 重 新 命 名 G e t M y P a r e n t
w r a p p e r 名 称 将 会 出 错 :
r e n a m e ( " G e t M y P a r e n t " , " G e t M y P a r e n t X " )
这 是 因 为 名 称 G e t M y P a r e n t 只 出 现 在 结 果 类 型 库 头 文 件 中 。
r e n a m e _ n a m e s p a c e 属 性
r e n a m e _ n a m e s p a c e ( " N e w N a m e " )
N e w N a m e
名 称 空 间 的 新 名 称
r e n a m e _ n a m e s p a c e 属 性 用 于 重 新 命 名 包 含 类 型 库 内 容 的 名 称 空 间 。 它 带 有 一 个
指 定 名 称 空 间 新 名 n e w n a m e 的 参 量 。
消 除 名 称 空 间 可 以 使 用 n o _ n a m e s p a c e 属 性 。
C + + 特 殊 处 结 束
# i n c l u d e 指 令
# i n c l u d e 指 令 告 诉 预 处 理 器 处 理 一 个 指 定 文 件 的 内 容 , 就 象 这 些 内 容 以 前 就 在
这 条 指 令 出 现 的 源 程 序 中 。 你 可 以 把 常 量 和 宏 定 义 放 在 包 含 文 件 中 , 然 后 用
# i n c l u d e 指 令 把 这 些 定 义 加 到 任 何 源 文 件 中 。 包 含 文 件 对 于 外 部 变 量 和 复 杂 数
据 类 型 结 合 的 说 明 也 是 有 用 的 。
你 只 需 在 为 此 目 的 创 建 的 一 个 包 含 文 件 中 定 义 和 命 名 这 些 类 型 一 次 。

语 法
# i n c l u d e " p a t h - s p e c "
# i n c l u d e < p a t h - s p e c >
p a t h _ s p e c 是 一 个 前 面 有 目 录 说 明 的 任 选 文 件 名 。 这 个 文 件 名 必 须 命 名 一 个 现 存
文 件 。
p a t h _ s p e c 的 语 法 依 赖 于 编 译 该 程 序 的 操 作 系 统 。
这 两 种 语 法 格 式 都 导 致 用 已 说 明 的 包 含 文 件 的 全 部 内 容 来 替 换 该 指 令 。 两 种 格
式 的 区 别 在 于 路 径 未 完 整 指 定 时 预 处 理 器 搜 索 头 文 件 的 顺 序 。
语 法 格 式 动 作
引 号 格 式 这 种 格 式 指 示 预 处 理 器 先 在 包 含 # i n c l u d e 语 句 的 文 件 的 相
同 目 录 内 搜 索 , 然 后 在 任 何 包 括 该 文 件 的 目 录 中 搜 索 。 随
后 预 处 理 器 沿 着 / I 编 译 器 选 项 指 定 的 路 径 搜 索 , 最 后 是 在
I N C L U D E 环 境 变 量 说 明 的 路 径 搜 索
尖 括 号 格 式 这 种 格 式 指 示 预 处 理 器 首 先 在 / I 编 译 器 选 项 指 定 的 路 径 中
搜 索 包 含 文 件 。 然 后 在 I N C L U D E 环 境 变 量 说 明 的 路 径 中 搜

一 旦 预 处 理 器 找 到 指 定 文 件 , 它 就 立 即 停 止 搜 索 。 如 果 用 双 引 号 给 出 一 个 明 确 完
整 的 包 含 文 件 的 路 径 , 预 处 理 器 将 只 搜 索 该 路 径 规 格 而 忽 略 标 准 目 录 。
如 果 在 双 引 号 间 的 文 件 名 不 是 一 个 完 整 的 路 径 规 格 , 预 处 理 器 将 先 搜 索 “ 父 ” 文
件 的 目 录 。父 文 件 是 一 个 包 含 # i n c l u d e 指 令 的 文 件 。例 如 , 如 果 你 把 名 称 为 f i l e 2
的 文 件 包 括 在 一 个 名 称 为 f i l e 1 的 文 件 中 , f i l e 1 就 是 父 文 件 。
包 含 文 件 可 被 嵌 套 ; 这 指 的 是 一 个 # i n c l u d e 指 令 出 现 在 以 另 一 个 # i n c l u d e 指 令命 名 的 文 件 里 。 例 如 , 以 上 的 文 件 f i l e 2 , 可 包 含 文 件 f i l e 3 , 在 这 种 情 况
下 ,  f i l e 1 是 f i l e 2 的 父 文 件 , 而 且 是 f i l e 3 的 祖 父 文 件 。
当 包 含 文 件 嵌 套 时 , 目 录 搜 索 首 先 由 父 文 件 的 目 录 开 始 , 然 后 , 搜 索 祖 父 文 件 的 目
录 。
因 此 , 搜 索 从 包 含 当 前 处 理 源 文 件 的 目 录 开 始 , 若 文 件 未 找 到 , 搜 索 就 转 到 / I 编
译 器 选 项 指 定 的 目 录 , 最 后 搜 索 i n c l u d e 环 境 变 量 指 定 的 目 录 。
下 面 的 例 子 给 出 使 用 尖 括 号 的 文 件 包 括 :
# i n c l u d e < s t d i o . h >
这 个 例 子 把 名 称 为 S T D I O . H 的 文 件 内 容 加 入 到 源 程 序 中 。 尖 括 号 指 示 预 处 理 器
在 搜 索 完 / I 编 译 器 选 项 说 明 的 目 录 之 后 , 搜 索 S T D I O . H 的 环 境 变 量 指 定 的 目 录 。
下 面 的 例 子 给 出 用 引 号 格 式 的 文 件 包 括 :
# i n c l u d e " d e f s . h "
这 个 例 子 把 D E F S . H 指 定 的 文 件 内 容 加 入 源 程 序 。 双 引 号 标 记 意 味 着 预 处 理 器 首
先 搜 索 包 含 父 源 文 件 的 目 录 。
包 含 文 件 的 嵌 套 可 高 达 1 0 层 , 只 要 在 处 理 嵌 套 的 # i n c l u d e 指 令 时 , 预 处 理 器 就
会 不 断 地 把 包 含 文 件 加 入 到 最 初 的 源 文 件 中 。
M i c r o s o f t 特 殊 处 →
为 了 定 位 可 包 括 源 文 件 , 预 处 理 器 首 先 搜 索 / I 编 译 器 选 项 指 定 的 目 录 。 若 / I 选
项 未 给 定 或 已 失 败 , 预 处 理 器 就 用 I N C L U D E 环 境 变 量 搜 索 尖 括 号 内 的 包 含 文 件 。
I N C L U D E 环 境 变 量 和 / I 编 译 器 选 项 可 包 含 用 分 号 分 开 的 多 个 路 径 。 若 在 / I 选 项
的 部 分 或 在 I N C L U D E 环 境 变 量 里 有 多 于 一 个 的 目 录 , 预 处 理 器 将 以 它 们 出 现 的 顺
序 对 它 们 进 行 搜 索 。

例 如 , 命 令 :
C L / I D : \ M S V C \ I N C L U D E M Y P R O G . C
导 致 预 处 理 器 在 目 录 D : \ M S V C \ I N C L U D E 中 搜 索 诸 如 S T D I O . H 的 包 含 文 件 。 命 令 :
S E T I N C L U D E = D : \ M S V C \ I N C L U D E
C L M Y P R O G . C
有 相 同 的 作 用 。 如 果 所 有 搜 索 都 失 败 了 , 将 产 生 一 个 致 命 编 译 错 误 。
如 果 用 包 括 一 个 冒 号 的 路 径 ( 例 如 , F : \ M S V C \ S P E C I A L \ I N C L \ T E S T . H ) 来 完 整 地 说
明 一 个 包 含 文 件 的 文 件 名 , 预 处 理 器 将 沿 此 路 径 搜 索 。
对 于 指 定 为 # i n c l u d e " p a t h _ s p e c " 的 包 含 文 件 , 目 录 搜 索 将 从 父 文 件 的 目 录 开 始 ,
然 后 搜 索 祖 父 文 件 的 目 录 。 因 此 , 搜 索 将 从 包 含 当 前 处 理 的 # i n c l u d e 指 令 的 源
文 件 的 目 录 开 始 , 如 果 没 有 祖 父 文 件 或 文 件 未 找 到 , 搜 索 将 继 续 , 就 像 文 件 名 包
括 在 尖 括 号 中 一 样 。
M i c r o s o f t 特 殊 处 结 束
# l i n e 指 令
# l i n e 指 令 告 诉 预 处 理 器 将 编 译 器 内 部 存 储 的 行 号 和 文 件 名 转 变 为 一 个 给 定 的
行 号 和 文 件 名 。 编 译 器 使 用 该 行 号 和 文 件 名 指 出 编 译 过 程 中 发 现 的 错 误 。 行 号
一 般 指 的 是 当 前 输 入 行 , 文 件 名 指 当 前 输 入 文 件 。 每 处 理 一 行 , 行 号 就 增 1 。
语 法
# l i n e
数 字 序 列 “ 文 件 名 ”
o p t
数 字 序 列 的 值 可 以 是 任 何 整 型 常 数 。 宏 替 换 可 在 预 处 理 语 言 符 号 中 执 行 , 但 结 果必 须 求 值 为 正 确 的 语 法 。 文 件 名 可 以 是 任 意 字 符 的 组 合 , 且 应 括 在 双 引 号 ( “ ” )
间 。 如 果 省 略 文 件 名 , 则 前 面 的 文 件 名 保 持 不 变 。
你 可 以 通 过 编 写 一 个 # l i n e 指 令 来 改 动 源 行 号 和 文 件 名 。 翻 译 器 使 用 行 号 和 文
件 名 来 确 定 预 定 义 宏
_ _
F I L E
_ _

_ _
L I N E
_ _
的 值 。 你 可 以 使 用 这 些 宏 把 自 描 述 错 误
消 息 加 入 到 程 序 文 本 中 。 有 关 这 些 宏 的 更 多 信 息 参 见 预 定 义 的 宏 。
_ _
F I L E
_ _
宏 扩 展 成 内 容 为 用 双 引 号 ( “ ” ) 括 起 的 文 件 名 的 一 个 字 符 串 。 
如 果 你 改 变 行 号 和 文 件 名 , 编 译 器 将 忽 略 原 有 的 值 , 用 新 值 继 续 处 理 。 # l i n e 指
令 通 常 被 程 序 生 成 器 用 来 生 成 指 向 最 初 源 程 序 的 错 误 消 息 , 而 不 是 生 成 程 序 。
下 面 的 例 子 用 于 说 明 # l i n e 以 及
_ _
L I N E
_ _

_ _
F I L E
_ _
宏 。 在 这 个 语 句 中 , 内 部 存
储 的 行 号 设 置 为 1 5 1 , 文 件 名 改 为 c o p y . c 。
# l i n e 1 5 1 " c o p y . c "
在 这 个 例 子 中 , 若 一 个 给 定 的 “ 断 言 ” ( a s s e r t i o n ) 不 为 真 ,  则 宏 A S S E R T 使 用 预
定 义 宏
_ _
L I N E
_ _

_ _
F I L E
_ _
打 印 出 一 个 关 于 源 文 件 的 错 误 消 息 。
# d e f i n e A S S E R T ( c o n d )
i f ( ! ( c o n d ) ) \
{ p r i n t f ( " a s s e r t i o n e r r o r l i n e % d , f i l e ( % s ) \ n " , \
_ _ L I N E _ _ , _ _ F I L E _ _ ) ; }
N u l l 指 令
空 预 处 理 器 指 令 是 一 行 中 一 个 单 独 的 数 字 标 号 ( # ) , 无 任 何 作 用 。
语 法

#
# u n d e f 指 令
正 如 其 名 所 隐 含 的 , # u n d e f 指 令 取 消 ( 反 定 义 ) 一 个 原 来 由 # d e f i n e 指 令 创 建 的 名
称 。
语 法
# u n d e f
标 识 符
# u n d e f 指 令 取 消 标 识 符 的 当 前 定 义 。 其 结 果 是 , 标 识 符 的 每 次 出 现 都 将 被 预 处
理 器 所 忽 略 。 为 取 消 一 个 用 # u n d e f 的 宏 定 义 , 只 须 给 出 宏 的 标 识 符 , 不 须 给 出 参
数 表 。
你 也 可 以 将 # u n d e f 指 令 用 于 一 个 原 来 未 定 义 的 标 识 符 。 这 将 确 认 这 个 标 识 符 是
未 定 义 的 。 宏 替 换 不 能 在 # u n d e f 语 句 中 执 行 。
# u n d e f 指 令 通 常 和 一 个 # d e f i n e 指 令 匹 配 , 以 在 源 程 序 中 创 建 一 个 区 域 ,  在 这 个
区 域 中 一 个 标 识 符 有 其 特 定 的 含 义 。 例 如 , 源 程 序 的 一 个 特 有 函 数 可 以 使 用 显 式
常 量 定 义 不 影 响 程 序 余 下 部 分 的 环 境 特 定 值 。 # u n d e f 指 令 也 可 与 # i f 指 令 配 对
以 控 制 源 程 序 的 条 件 编 译 过 程 。有 关 更 多 信 息 参 见“ # i f 、# e l i f 、# e l s e 和 # e n d i f
指 令 ”。
下 面 的 例 子 中 , # u n d e f 指 令 取 消 了 一 个 符 号 常 量 和 一 个 宏 的 定 义 , 注 意 该 指 令 只
给 出 了 宏 的 标 识 符 。
# d e f i n e W I D T H 8 0
# d e f i n e A D D ( X , Y ) ( X ) + ( Y )

.
.
.
# u n d e f W I D T H
# u n d e f A D D
M i c r o s o f t 特 殊 处 →
宏 可 通 过 采 用 / U 选 项 的 命 令 行 反 定 义 , 此 命 令 行 后 跟 反 定 义 的 宏 名 称 。 此 命 令
与 在 文 件 开 头 处 的 # u n d e f 宏 名 称 语 句 序 列 的 作 用 是 相 等 的 。
M i c r o s o f t 特 殊 处 结 束
预 处 理 器 操 作 符
# d e f i n e 指 令 的 文 本 中 有 四 种 预 处 理 器 特 有 的 操 作 符 ( 它 们 的 总 结 参 见 下 面 的
表 ) 。
字 符 化 、 字 符 串 化 和 语 言 符 号 粘 贴 操 作 符 将 在 下 面 三 章 中 讨 论 。 d e f i n e d 操 作
符 的 信 息 参 见 “ # i f 、 # e l i f 、 # e l s e 和 # e n d i f 指 令 ”。
运 算 符 动 作
字 符 串 化 操 作 符 ( # ) 将 相 应 实 参 置 于 双 引 号 内
字 符 化 操 作 符 ( # @ ) 将 相 应 的 参 量 置 于 单 引 号 内 , 且 将 其 作 为
字 符 处 理 ( M i c r o s o f t 特 殊 处 )
语 言 符 号 粘 贴 操 作 符 ( # # ) 可 将 语 言 符 号 作 为 实 参 使 用 , 且 将 其 合 并
为 其 它 的 语 言 符 号

定 义 的 操 作 符 简 化 在 某 特 定 宏 指 令 中 复 合 表 达 式 的 写 法
字 符 串 化 操 作 符 ( # )
数 字 符 号 或 “ 字 符 串 化 ” 操 作 符 ( # ) 将 宏 参 数 ( 扩 展 后 ) 转 化 为 字 符 串 常 量 。 它 只
用 于 带 参 量 的 宏 。 如 果 它 在 宏 定 义 中 的 一 个 形 式 参 量 之 前 , 宏 调 用 传 给 的 实 际 参
量 就 被 括 在 双 括 号 中 , 且 被 看 作 为 一 个 字 符 串 文 字 。 然 后 该 字 符 串 文 字 将 替 换 该
宏 定 义 中 操 作 符 和 形 参 组 合 的 每 次 出 现 。
实 参 的 第 一 个 语 言 符 号 之 前 和 最 后 一 个 语 言 符 号 之 后 的 空 白 被 忽 略 。 实 参 中 语
言 符 号 之 间 的 所 有 空 白 在 结 果 字 符 串 语 义 中 都 被 看 作 为 一 个 空 格 。 因 此 , 若 实 参
中 的 一 个 注 解 出 现 在 两 个 语 言 符 号 之 间 , 它 将 被 看 作 为 一 个 空 格 。 结 果 字 符 串 文
字 自 动 地 与 任 何 仅 用 空 格 分 开 的 相 邻 字 符 串 文 字 连 接 。
此 外 , 如 果 一 个 包 含 在 参 量 里 的 字 符 在 用 作 一 个 字 符 串 文 字 ( 例 如 , 双 引 号 ( " ) 或
反 斜 杠 ( \ ) 字 符 ) 时 通 常 需 要 一 个 转 义 序 列 ,  必 要 的 转 义 反 斜 杠 被 自 动 地 插 入 字
符 之 前 。 下 面 的 例 子 给 出 了 一 个 包 含 字 符 串 化 操 作 符 的 宏 定 义 和 一 个 调 用 该 宏
的 m a i n 函 数 :
# d e f i n e s t r i n g e r ( x ) p r i n t f ( # x " \ n " )
v o i d m a i n ( )
{
s t r i n g e r ( I n q u o t e s i n t h e p r i n t f f u n c t i o n c a l l \ n ) ;
s t r i n g e r ( " I n q u o t e s w h e n p r i n t e d t o t h e s c r e e n " \ n ) ;

s t r i n g e r ( " T h i s : \ " p r i n t s a n e s c a p e d d o u b l e q u o t e " ) ;
}
这 种 调 用 在 预 处 理 时 会 被 扩 展 , 产 生 如 下 代 码 :
v o i d m a i n ( )
{
p r i n t f ( " I n q u o t e s i n t h e p r i n t f f u n c t i o n c a l l \ n " " \ n " ) ;
p r i n t f ( " \ " I n q u o t e s w h e n p r i n t e d t o t h e s c r e e n \ " \ n " " \ n " ) ;
p r i n t f ( " \ " T h i s ; \ \ \ " p r i n t s a n e s c a p e d d o u b l e q u o t e \ " " " \ n " ) ;
}
当 运 行 该 程 序 时 , 每 行 的 屏 幕 输 出 如 下 :
I n q u o t e s i n t h e p r i n t f f u n c t i o n c a l l
" I n q u o t e s w h e n p r i n t e d t o t h e s c r e e n "
" T h i s ; \ " p r i n t s a n e s c a p e d d o u b l e q u o t a t i o n m a r k "
M i c r o s o f t 特 殊 处 →
M i c r o s o f t C ( 版 本 6 . 0 及 更 早 版 本 ) 扩 展 A N S I C 的 标 准 , A N S I C 扩 展 在 字 符 串
文 字 和 字 符 常 量 中 出 现 的 宏 形 式 参 量 不 再 被 支 持 。 依 赖 于 此 扩 展 的 代 码 应 该 使
用 字 符 串 化 操 作 符 ( # ) 重 写 。
M i c r o s o f t 特 殊 处 结 束

字 符 化 操 作 符 ( # @ )
M i c r o s o f t 特 殊 处 →
字 符 化 操 作 符 只 可 用 于 宏 参 量 , 若 宏 定 义 中 # @ 在 一 个 形 参 前 , 则 实 参 应 被 放 在 单
引 号 中 , 在 宏 扩 展 时 作 为 一 个 字 符 处 理 。 例 如 :
# d e f i n e m a k e c h a r ( x ) # @ x
将 语 句 :
a = m a k e c h a r ( b ) ;
扩 展 为 :
a = ' b ' ;
单 引 号 字 符 不 能 用 于 字 符 化 操 作 符 。
M i c r o s o f t 特 殊 处 结 束
语 言 符 号 粘 贴 操 作 符 ( # # )
双 数 字 语 言 符 号 或 “ 语 言 符 号 粘 贴 ” 操 作 符 ( # # ) , 有 时 称 作 “ 合 并 ” 操 作 符 , 用
于 类 对 象 宏 和 类 函 数 宏 中 。 它 允 许 将 分 开 的 语 言 符 号 加 入 一 个 单 个 语 言 符 号 中 ,
因 此 不 能 是 宏 定 义 的 第 一 个 语 言 符 号 或 最 后 一 个 语 言 符 号 。
如 果 一 个 宏 定 义 中 的 形 参 在 语 言 符 号 粘 贴 操 作 符 的 前 后 , 则 形 参 将 立 即 被 未 扩 展
的 实 参 替 换 。 在 替 换 之 前 不 对 参 量 执 行 宏 扩 展 。
然 后 , 语 言 符 号 字 符 串 中 语 言 符 号 粘 贴 操 作 符 的 每 次 出 现 将 被 删 除 , 其 前 后 的 语
言 符 号 将 被 合 并 。 其 结 果 语 言 符 号 必 须 是 一 个 有 效 的 语 言 符 号 。 若 其 有 效 , 如 果
该 语 言 符 号 代 表 一 个 宏 名 称 , 则 扫 描 它 以 发 现 可 能 的 替 换 。 该 标 识 符 表 示 在 替 换前 程 序 中 己 知 合 并 的 语 言 符 号 的 名 称 。 每 个 语 言 符 号 都 代 表 一 个 在 程 序 中 或 在
编 译 器 命 令 行 中 定 义 的 语 言 符 号 。
该 操 作 符 前 后 的 空 白 是 任 意 的 。
如 下 例 子 说 明 了 程 序 输 出 中 字 符 串 化 操 作 符 和 语 言 符 号 粘 贴 操 作 符 的 用 法 :
# d e f i n e p a s t e r ( n ) p r i n t f ( " t o k e n " # n " = % d " , t a k e n # # n )
i n t t o k e n 9 = 9 ;
若 一 个 宏 用 一 个 类 似 于 下 面 的 数 值 参 量 调 用 :
p a s t e r ( 9 ) ;
宏 将 生 成 :
p r i n t f ( " t o k e n " " 9 " " = % d " , t o k e n 9 ) ;
它 变 成 为 :
p r i n t f ( " t o k e n 9 = % d " , t o k e n 9 ) ;

对 宏 扩 展 的 预 处 理 在 所 有 那 些 不 是 预 处 理 指 令 的 行 ( 第 一 个 非 空 白 字 符 不 是 # 的
行 ) , 以 及 其 指 令 并 未 作 为 条 件 编 译 的 一 部 分 而 忽 略 的 行 中 进 行 。“ 条 件 编 译 ” 指
令 允 许 通 过 检 测 一 个 常 量 表 达 式 或 标 识 符 以 决 定 在 预 处 理 过 程 中 哪 个 文 本 块 送
入 编 译 器 、 哪 个 文 本 块 从 源 文 件 中 删 除 , 并 以 此 种 方 式 控 制 一 个 源 文 件 中 某 部 分
的 编 译 。
# d e f i n e 指 令 通 常 使 用 有 意 义 的 标 识 符 与 常 量 、 关 键 字 、 常 用 语 句 和 表 达 式 关
联 。 表 示 常 量 的 标 识 符 有 时 被 称 作 “ 符 号 常 量 ” 或 “ 显 式 ” 常 量 。 表 示 语 句 或表 达 式 的 常 量 称 为 “ 宏 ”。 在 本 预 处 理 器 文 档 中 , 只 使 用 术 语 “ 宏 ”。
当 宏 的 名 称 在 程 序 源 文 本 或 在 某 些 其 它 预 处 理 器 命 令 的 参 量 中 被 识 别 时 , 它 被 处
理 为 对 该 宏 的 调 用 。 宏 名 称 被 宏 体 的 一 个 拷 贝 所 替 换 。 若 该 宏 接 受 参 量 , 宏 名 称
后 的 实 参 就 会 替 换 宏 体 中 的 形 参 。 用 宏 体 中 处 理 的 拷 贝 来 替 换 一 个 宏 调 用 的 过
程 , 称 为 宏 调 用 的 “ 扩 展 ”。
实 际 的 术 语 中 有 两 种 类 型 的 宏 。“ 类 对 象 ” 宏 不 带 参 量 , 而 “ 类 函 数 ” 宏 可 定 义
为 带 参 量 。因 此 它 们 的 形 式 和 功 能 都 象 函 数 调 用 , 由 于 宏 不 生 成 实 际 的 函 数 调 用 ,
所 以 有 时 可 用 宏 替 代 函 数 调 用 使 程 序 运 行 得 更 快 , ( 在 C + + 中 , i n l i n e 函 数 通 常 是
一 个 好 方 法 ) , 然 而 , 如 果 不 小 心 的 定 义 和 使 用 宏 , 也 可 能 造 成 麻 烦 。 在 带 参 量 的
宏 定 义 时 , 你 必 须 使 用 括 号 以 保 持 一 个 表 达 式 中 正 常 的 优 先 级 , 同 时 宏 也 不 能 正
确 地 处 理 具 有 副 作 用 的 表 达 式 。 有 关 更 多 的 信 息 参 见 “ # d e f i n e 指 令 ” 中 的 例
子 g e t r a n d o m 。
一 旦 你 定 义 了 一 个 宏 , 你 不 能 不 经 取 消 该 宏 原 有 定 义 , 而 重 新 定 义 它 为 一 个 不 同
的 值 。 但 可 用 正 好 相 同 的 定 义 来 重 定 义 该 宏 , 因 此 , 一 个 程 序 中 宏 的 相 同 定 义 可
出 现 多 次 。
# u n d e f 指 令 用 于 取 消 宏 的 定 义 。 一 旦 取 消 该 宏 的 定 义 , 就 可 重 新 定 义 该 宏 为 一
个 不 同 的 值 。 # d e f i n e 和 # u n d e f 两 节 分 别 详 细 讨 论 了 # d e f i n e 和 # u n d e f 指 令 。
宏 和 C + +
C + + 提 供 了 一 些 新 的 功 能 。 其 中 有 些 功 能 替 代 了 原 来 由 A N S I C 所 提 供 的 功 能 。
这 些 新 的 功 能 增 强 了 类 型 安 全 性 和 该 语 言 的 可 预 测 性 :
z 在 C + + 中 , 以 c o n s t 说 明 的 对 象 可 用 于 常 量 表 达 式 中 , 这 使 程 序 可 以说 明 有 类 型 和 值 信 息 的 常 量 , 以 及 能 被 调 试 器 逐 个 字 符 检 查 的 枚 举
值 的 常 量 。 使 用 预 处 理 器 指 令 # d e f i n e 定 义 常 量 并 不 精 确 。 除 非 在
程 序 中 找 到 一 个 带 地 址 的 表 达 式 , 否 则 一 个 c o n s t 对 象 将 不 分 配 任
何 存 储 。
z C + + 联 编 函 数 替 代 了 函 数 类 型 宏 , 相 对 于 宏 来 说 使 用 联 编 函 数 的 优 势
在 于 :
z 类 型 安 全 性 。 联 编 函 数 和 一 般 函 数 一 样 需 进 行 相 同 的 类 型 检 测 , 宏
无 类 型 安 全 性 检 测 。
z 纠 正 具 有 副 作 用 的 参 量 处 理 。 联 编 函 数 在 进 入 函 数 体 之 前 对 参 量 的
表 达 式 求 值 。 因 此 , 一 个 有 副 作 用 的 表 达 式 将 是 安 全 的 。
对 于 联 编 函 数 的 更 多 信 息 参 见 i n l i n e 、
_ _
i n l i n e 节 。
为 了 向 下 兼 容 , M i c r o s o f t C + + 保 留 了 所 有 在 A N S I C 和 更 早 C + + 规 格 中 的 预 处 理
器 功 能 。
预 定 义 宏
编 译 器 可 识 别 六 种 预 定 义 的 A N S I C 宏 ( 参 见 表 1 . 1 ) , 而 M i c r o s o f t C + + 实 现 提 供
更 多 的 预 定 义 宏 ( 参 见 表 1 . 2 ) 。 这 些 宏 不 带 参 量 , 但 不 能 被 重 定 义 。 它 们 的 值 ( 除
_ _
L I N E
_ _

_ _
F I L E
_ _
外 ) 必 须 是 经 过 编 译 的 常 量 。 下 面 列 出 的 一 些 预 定 义 宏 须 用
多 个 值 来 定 义 , 它 们 的 值 可 在 V i s u a l C + + 开 发 环 境 中 选 择 相 应 的 菜 单 选 项 来 设
置 或 采 用 命 令 行 开 关 。 更 多 的 信 息 参 见 下 表 。表 1 . 1 A N S I 预 定 义 宏
宏 说 明
_ _
D A T E
_ _
当 前 源 文 件 的 编 译 日 期 。 日 期 是 格 式 为 M m m d d y y y y 的 字
符 串 文 字 。 月 份 名 称 M m m 与 在 T I M E . H 中 说 明 的 库 函 数
a s c t i m e 产 生 的 日 期 一 样
_ _
F I L E
_ _
当 前 源 文 件 名 称 。
_ _
F I L E
_ _
扩 展 为 用 双 引 号 括 起 的 一 个 字 符

_ _
L I N E
_ _
当 前 源 文 件 的 行 号 。 该 行 号 是 一 个 十 进 制 整 型 常 量 。 可 用
一 个 # l i n e 指 令 修 改
_ _
S T D C
_ _
指 出 与 A N S I C 标 准 的 完 全 一 致 性 。 仅 当 给 出 / Z a 编 译 器 选
项 且 不 编 译 C + + 代 码 时 定 义 为 整 型 量 1 ; 否 则 是 不 确 定 的
_ _
T I M E
_ _
当 前 文 件 的 最 近 编 译 时 间 。 该 时 间 是 格 式 为 h h : m m : s s 的 字
符 串 文 字
_ _
T I M E S T A M P
_ _
当 前 源 文 件 的 最 近 修 改 日 期 。 日 期 是 格 式 为 D d d M m m D a t e
h h : m m : s s y y y y 的 字 符 串 文 字 , 这 里 D d d 是 星 期 几 的 简
写 , D a t e 是 从 1 到 3 1 的 一 个 整 数
表 1 . 2 M i c r o s o f t 特 殊 预 定 义 的 宏
宏 说 明
_ _
C H A R _ U N S I G N E D 缺 省 c h a r 类 型 是 无 符 号 的 , 当 指 定 / J 时 定 义 的
_ _
c p l u s p l u s 仅 为 C + + 程 序 定 义

_ _
C P P R T T I 定 义 为 用 / G R 编 译 的 代 码 ( 允 许 运 行 时 类 型 信 息 )
_ _
C P P U N W I N D 定 义 为 用 / G X 编 译 的 代 码 ( 允 许 异 常 处 理 )
_ _
D L L 指 定 / M D 或 / M D d ( 多 线 程 D L L ) 时 定 义 的
_ _
M _ A L P H A 为 D E C A L P H A 平 台 定 义 , 使 用 A L P H A 编 译 器 时 定 义 为 1 , 若
使 用 另 一 个 编 译 器 时 不 定 义
_ _
M
_
I X 8 6 为 x 8 6 处 理 器 定 义 , 参 见 表 1 . 3
_ _
M
_
M P P C 为 P o w e r M a c i n t o s h 平 台 定 义 , 缺 省 为 6 0 1 ( / Q P 6 0 1 ) 参 见
表 1 . 4
_ _
M
_
M R X 0 0 0 为 M I P S 平 台 定 义 ,  缺 省 为 4 0 0 0 ( / Q M R 4 0 0 0 ) , 参 见 表 1 . 5
_ _
M
_
P P C 为 P o w e r P C 平 台 定 义 , 缺 省 为 6 0 4 ( / Q P 6 0 4 ) , 参 见 表 1 . 6
_ _
M F C
_
V E R 为 M F C 版 本 定 义 , 为 M i c r o s o f t F o u n n d a t i o n 类 库 4 . 2 1
定 义 为 0 x 0 4 2 1 , 它 总 是 定 义 的
_ _
M S C
_
E X T E N S I O N S 该 宏 在 使 用 / Z e 编 译 选 项 ( 缺 省 值 ) 时 定 义 , 定 义 时 其 值 总
为 1
_ _
M S C
_
V E R 定 义 编 译 器 版 本 , 对 于 M i c r o s o f t V i s u a l C + + 6 . 0 定 义
为 1 2 0 0 , 它 总 是 定 义 的
_ _
M T 当 指 定 / M D 或 / M D d ( 多 线 程 D L L ) 或 / M T 或 / M T d ( 多 线 程 ) 选
项 时 定 义
_ _
W I N 3 2 为 W i n 3 2 应 用 程 序 而 定 义 。 它 总 是 定 义 的
如 下 表 所 示 , 编 译 器 对 反 映 处 理 器 选 项 的 预 处 理 器 标 识 符 产 生 一 个 值 。

开 发 者 的 选 项 命 令 行 选 项 返 回 值
B l e n d / G B _ M _ I X 8 6 = 5 0 0 ( 缺 省 值 。 将 来 的 编
译 器 将 给 出 一 个 不 同 的 值 以 影 响
主 处 理 器 )
P e n t i u m / G 5 _ M _ I X 8 6 = 5 0 0
P e n t i u m P r o / G 6 _ M _ I X 8 6 = 6 0 0
8 0 3 8 6 / G 3 _ M _ I X 8 6 = 3 0 0
8 0 4 8 6 / G 4 _ M _ I X 8 6 = 4 0 0
表 1 . 4 _ M _ M P P C 的 值
开 发 者 的 选 项 命 令 行 选 项 返 回 值
P o w e r P C 6 0 1 / Q P 6 0 1 _ M _ M P P C = 6 0 1 ( 缺 省 值 )
P o w e r P C 6 0 3 / Q P 6 0 3 _ M _ M P P C = 6 0 3
P o w e r P C 6 0 4 / Q P 6 0 4 _ M _ M P P C = 6 0 4
P o w e r P C 6 2 0 / Q P 6 2 0 _ M _ M P P C = 6 2 0
表 1 . 5 _ M _ M R X 0 0 0 的 值
开 发 者 选 项 命 令 行 选 项 返 回 值
R 4 0 0 0 / Q M R 4 0 0 0 _ M _ M R X 0 0 0 = 4 0 0 0 ( 缺 省 值 )
R 4 1 0 0 / Q M R 4 1 0 0 _ M _ M R X 0 0 0 = 4 1 0 0
R 4 2 0 0 / Q M R 4 2 0 0 _ M _ M R X 0 0 0 = 4 2 0 0

续 表
R 4 4 0 0 / Q M R 4 4 0 0 _ M _ M R X 0 0 0 = 4 4 0 0
R 4 6 0 0 / Q M R 4 6 0 0 _ M _ M R X 0 0 0 = 4 6 0 0
R 1 0 0 0 0 / Q M R 1 0 0 0 0 _ M _ M R X 0 0 0 = 1 0 0 0 0
表 1 . 6 _ M _ P P C 的 值
开 发 者 选 项 命 令 行 选 项 返 回 值
P o w e r P C 6 0 1 / Q P 6 0 1 _ M _ P P C = 6 0 1
P o w e r P C 6 0 3 / Q P 6 0 3 _ M _ P P C = 6 0 3
P o w e r P C 6 0 4 / Q P 6 0 4 _ M _ P P C = 6 0 4 ( 缺 省 值 )
P o w e r P C 6 2 0 / Q P 6 2 0 _ M _ P P C = 6 2 0

分享到:
评论

相关推荐

    C#预处理器指令的用法实例分析

    本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下: C#预处理器指令是在编译时调用的。预处理器指令(preprocessor directive)告诉C#编译器要编译哪些代码,并指出如何处理特定的错误...

    C# 中的预处理器指令:成为专业人士的指南

    C# 中的预处理器指令:成为专业人士的指南

    C#中的预处理器指令详解

    如果计划发布两个版本的代码,即基本版本和拥有更多功能的企业版本,就可以使用这些预处理器指令。在编译软件的基本版本时,使用预处理器指令可以禁止编译器编译与额外功能相关的代码。  另外,在编写提供调

    dwm-flexipatch:带有预处理器指令的 dwm 构建,用于决定在构建期间包含哪些补丁

    它使用预处理器指令来决定是否在构建期间包含补丁。 从本质上讲,这意味着无论好坏,此构建都包含修补过的代码和原始代码。 目的是您可以选择要包含哪些补丁,并且构建将包含该代码,仅此而已。 由于某些补丁的复杂...

    简介C/C++预处理器的一些工作

    好吧,预处理器的指令就被叫做预处理器指令,而他们都以一个#开头. 像 #include 这样? 正确. 每一个被预处理器遇到的 # 命令都会导致在某种方式上对源代码的修改. 让我们来简单的研究研究它们,然后我们就会之后这...

    浅谈c++ 预处理器

    所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们已经看到,之前所有的实例中都有 #include 指令。这个宏用于把头文件...

    深入理解C预处理器

    它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。 下表包含所有重要的预处理器指令: 指令 描述 #define 定义宏 #include 包含一个源代码文件 #undef 取消已定义的宏...

    14. 预处理器.docx

    这份文件是关于C语言预处理器的详细介绍,包括其工作原理、主要功能、GCC编译过程中预处理器的角色以及预处理指令的使用和规则。以下是文件的核心内容概要: 1. **预处理器工作原理**: 2. **GCC编译过程及常用选项*...

    aleppo:备用Erlang预处理器

    阿勒颇:替代Erlang预处理或 Aleppo是epp(3erl)的替代产品,主要用于Erlang... 预处理器指令可在函数内部使用 原料药 aleppo:process_file&#40;FileName&#41; -&gt; {ok, Tokens} | {error, Error} aleppo:process_

    C语言预处理器

    它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。 下面列出了所有重要的预处理器指令: (1)#define 描述:用来定义宏。 格式:#define 宏名(参数表) 字符串 例: #def

    C#中变量、常量、枚举、预处理器指令知多少

    一、变量 C#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { private static uint variableUInt;...

    MSDN上最新的C#指南(带目录) 高清PDF

    此部分详细介绍了 C# 语言主要功能,以及通过 .NET Framework 可以在 C# 中使用的功能。...若要了解特定的关键字、运算符和预处理器指令,请参阅 C# 参考。 若要了解 C# 语言规范,请参阅 C# 语言规范。

    [MSDN]C#编程指南+参考手册.chm

    全中文。 本节提供有关关键的 C# 语言功能和 C# 可通过 .NET Framework 访问的功能的详细信息。...有关特定的关键字、运算符和预处理器指令的信息,请参见 C# 参考。有关 C# 语言规范的信息,请参见 C# 语言规范。

    C#编程指南+参考手册

    有关特定的关键字、运算符和预处理器指令的信息,请参见 C# 参考。有关 C# 语言规范的信息,请参见 C# 语言规范。 C# 参考 :这部分提供有关 C# 关键字、运算符、编译器错误和警告的参考资料。

    Atmel AVR微控制器系列 的汇编器_C语言_代码_相关文件_下载

    AVRA Atmel AVR 微控制器系列的汇编程序 ...支持一些额外的预处理器指令 .define、.undef、.ifdef、.ifndef、.if、.else、.endif、.elif、.elseif、.warning 更多详情、使用方法,请下载后阅读README.md文件

    如何在C++中添加头文件,c++万能库头文件

    避免重复包含:为了避免同一个头文件被多次包含,通常会在头文件的开头和结尾使用预处理器指令来防止重复包含 编译程序:最后,使用C++编译器编译你的程序。编译器会处理所有的#include指令,并将包含的头文件内容...

    万能头文件在C语言中的重要性及其主要格式.docx

    万能头文件 如果你是在特定场景(比如算法竞赛训练...防止重复包含:使用预处理器指令#ifndef、#define和#endif来确保头文件不会被重复包含。 C #ifndef UNIVERSAL_HEADER_H #define UNIVERSAL_HEADER_H // 这里包含

Global site tag (gtag.js) - Google Analytics