好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C语言预处理命令的总结大全.pdf

8页
  • 卖家[上传人]:豆浆
  • 文档编号:2225922
  • 上传时间:2017-07-21
  • 文档格式:PDF
  • 文档大小:44.21KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • C程 序 的 源 代 码 中 可 包 括 各 种 编 译 指 令 , 这 些 指 令 称 为 预 处 理 命 令 虽 然 它 们 实 际 上 不 是 C语 言 的 一 部 分 , 但 却 扩 展 了 C程 序 设 计 的 环 境 本 节 将 介 绍 如 何 应 用 预 处 理 程 序 和 注 释 简化 程 序 开 发 过 程 , 并 提 高 程 序 的 可 读 性 ANSI标 准 定 义 的 C语 言 预 处 理 程 序 包 括 下 列 命 令 : #define, #eror, #include, #if, #else, #elif, #endif, #ifdef, #ifndef, #undef, #line,#pragma等 非 常 明 显 , 所 有 预 处 理 命 令 均 以 符 号 #开 头 , 下 面 分 别 加 以 介 绍 一 #define 命 令 #define定 义 了 一 个 标 识 符 及 一 个 串 在 源 程 序 中 每 次 遇 到 该 标 识 符 时 , 均 以 定 义的 串 代 换 它 ANSI标 准 将 标 识 符 定 义 为 宏 名 , 将 替 换 过 程 称 为 宏 替 换 。

      命 令 的 一 般 形 式 为 : #define identifier string注 意 : 1该 语 句 没 有 分 号 在 标 识 符 和 串 之 间 可 以 有 任 意 个 空 格 , 串 一 旦 开 始 , 仅 由 一 新 行 结束 2宏 名 定 义 后 , 即 可 成 为 其 它 宏 名 定 义 中 的 一 部 分 3 宏 替 换 仅 仅 是 以 文 本 串 代 替 宏 标 识 符 , 前 提 是 宏 标 识 符 必 须 独 立 的 识 别 出 来 , 否 则 不进 行 替 换 例 如 : #define XYZ this is a tes使 用 宏 printf("XYZ");/该 段 不 打 印 "this is a test"而 打 印 "XYZ" 因 为 预 编 译 器 识 别 出 的是 "XYZ"4如 果 串 长 于 一 行 , 可 以 在 该 行 末 尾 用 一 反 斜 杠 ' \'续 行 #defineLONG_STRING"this is a very long\ string that is used as an example"5 C语 言 程 序 普 遍 使 用 大 写 字 母 定 义 标 识 符 。

      6 用 宏 代 换 代 替 实 在 的 函 数 的 一 大 好 处 是 宏 替 换 增 加 了 代 码 的 速 度 , 因 为 不 存 在 函 数 调用 的 开 销 但 增 加 速 度 也 有 代 价 : 由 于 重 复 编 码 而 增 加 了 程 序 长 度 二 #eror 命 令 #eror强 迫 编 译 程 序 停 止 编 译 , 主 要 用 于 程 序 调 试 #eror指 令 使 预 处 理 器 发 出 一 条 错 误 消 息 , 该 消 息 包 含 指 令 中 的 文 本 这 条 指 令 的 目 的就 是 在 程 序 崩 溃 之 前 能 够 给 出 一 定 的 信 息 三 #include 命 令 #i nclude使 编 译 程 序 将 另 一 源 文 件 嵌 入 带 有 #include的 源 文 件 , 被 读 入 的 源 文 件 必须 用 双 引 号 或 尖 括 号 括 起 来 例 如 : #include"stdio.h"或 者 #include这 两 行 代 码 均 使 用 C编 译 程 序 读 入 并 编 译 用 于 处 理 磁 盘 文 件 库 的 子 程 序 。

      将 文 件 嵌 入 #i nclude命 令 中 的 文 件 内 是 可 行 的 , 这 种 方 式 称 为 嵌 套 的 嵌 入 文 件 , 嵌 套 层次 依 赖 于 具 体 实 现 如 果 显 式 路 径 名 为 文 件 标 识 符 的 一 部 分 , 则 仅 在 那 些 子 目 录 中 搜 索 被 嵌 入 文 件 否 则 ,如 果 文 件 名 用 双 引 号 括 起 来 , 则 首 先 检 索 当 前 工 作 目 录 如 果 未 发 现 文 件 , 则 在 命 令 行 中 说明 的 所 有 目 录 中 搜 索 如 果 仍 未 发 现 文 件 , 则 搜 索 实 现 时 定 义 的 标 准 目 录 如 果 没 有 显 式 路 径 名 且 文 件 名 被 尖 括 号 括 起 来 , 则 首 先 在 编 译 命 令 行 中 的 目 录 内 检 索 如 果 文 件 没 找 到 , 则 检 索 标 准 目 录 , 不 检 索 当 前 工 作 目 录 四 条 件 编 译 命 令 有 几 个 命 令 可 对 程 序 源 代 码 的 各 部 分 有 选 择 地 进 行 编 译 , 该 过 程 称 为 条 件 编 译 。

      商 业 软件 公 司 广 泛 应 用 条 件 编 译 来 提 供 和 维 护 某 一 程 序 的 许 多 顾 客 版 本 #if、 #else, #elif及 #endif #if的 一 般 含 义 是 如 果 #if后 面 的 常 量 表 达 式 为 true, 则 编 译 它 与 #endif之 间 的 代 码 , 否则 跳 过 这 些 代 码 命 令 #endif标 识 一 个 #if块 的 结 束 #if constant-expresionstatement sequence #endif Eg:#define MAX 91 #include using namespace std; int main(){ #if MAX > 9 cout《 "MAX is biger than 9"《 endl;#elif MAX > 90 cout《 "MAX is biger than 90"《 endl; #elsecout《 "MAX is smaler than 90"《 endl; #endif return 0;} 跟 在 #if后 面 的 表 达 式 在 编 译 时 求 值 , 因 此 它 必 须 仅 含 常 量 及 已 定 义 过 的 标 识 符 , 不 可使 用 变 量 。

      表 达 式 不 许 含 有 操 作 符 sizeof(sizeof也 是 编 译 时 求 值 ) #else命 令 的 功 能 有 点 象 C语 言 中 的 else;#else建 立 另 一 选 择 (在 #if失 败 的 情 况 下 ) 注 意 ,#else属 于 #if块 #elif命 令 意 义 与 ELSE IF 相 同 , 它 形 成 一 个 if else-if阶 梯 状 语 句 , 可 进 行 多 种 编 译 选择 #elif 后 跟 一 个 常 量 表 达 式 如 果 表 达 式 为 true, 则 编 译 其 后 的 代 码 块 , 不 对 其 它 #elif表 达 式 进 行 测 试 否 则 , 顺 序 测 试 下 一 块 if expresion statement sequence #elif expresion1statement sequence #endif 在 嵌 套 的 条 件 编 译 中 #endif、 #else或 #elif与 最 近 #if或 #elif匹 配 # ifdef 和 # ifndef条 件 编 译 的 另 一 种 方 法 是 用 #ifdef与 #ifndef命 令 , 它 们 分 别 表 示 "如 果 有 定 义 "及 "如 果 无定 义 "。

      # ifdef的 一 般 形 式 是 :# ifdef macroname statement sequence #endif#ifdef与 #ifndef可 以 用 于 #if、 #else, #elif语 句 中 , 但 必 须 与 一 个 #endif #define MAX 91 #includeusing namespace std; int main() {#ifdef MAX cout《 "helo,MAX!"《 endl; #elsecout《 "where is MAX?"《 endl; #endif #ifndef LEOcout《 "LEO is not defined"《 endl; #endif return 0;} 命 令 #undef 取 消 其 后 那 个 前 面 已 定 义 过 有 宏 名 定 义 一 般 形 式 为 : #undef macroname 命 令 #line改 变 _LINE_与 _FILE_的 内 容 , 它 们 是 在 编 译 程 序 中 预 先 定 义 的 标 识 符 命 令 的 基 本 形 式 如 下 : #line number["filename"]其 中 的 数 字 为 任 何 正 整 数 , 可 选 的 文 件 名 为 任 意 有 效 文 件 标 识 符 。

      行 号 为 源 程 序 中 当 前行 号 , 文 件 名 为 源 文 件 的 名 字 命 令 #line主 要 用 于 调 试 及 其 它 特 殊 应 用 注 意 : 在 #line后面 的 数 字 标 识 从 下 一 行 开 始 的 数 字 标 识 #line 10 "jia"cout《 "#line change line and filename!"《 endl; /line 10 cout《 _LINE_《 endl; /101 cout《 _FILE_《 endl; /jia五 #pragma 命 令 #pragma 为 实 现 时 定 义 的 命 令 , 它 允 许 向 编 译 程 序 传 送 各 种 指 令 #pragma的 作 用 是 设 定 编 译 器 的 状 态 或 者 是 指 示 编 译 器 完 成 一 些 特 定 的 动 作 #pragma指 令 对 每 个 编 译 器 给 出 了 一 个 方 法 , 在 保 持 与 C和 C+语 言 完 全 兼 容 的 情 况 下 , 给 出 主 机或 操 作 系 统 专 有 的 特 征 依 据 定 义 , 编 译 指 示 是 机 器 或 操 作 系 统 专 有 的 , 且 对 于 每 个 编 译 器都 是 不 同 的 。

      其 格 式 一 般 为 : #Pragma Para 1 mesage 参 数 Mesage 参 数 能 够 在 编 译 信 息 输 出 窗 口 中 输 出 相 应 的 信 息 , 这 对 于 源 代 码 信 息 的 控 制 是非 常 重 要 的 其 使 用 方 法 为 : #pragm a m esage(“消 息 文 本 ”)当 编 译 器 遇 到 这 条 指 令 时 就 在 编 译 输 出 窗 口 中 将 消 息 文 本 打 印 出 来 当 我 们 在 程 序 中 定 义 了 许 多 宏 来 控 制 源 代 码 版 本 的 时 候 , 我 们 自 己 有 可 能 都 会 忘 记 有 没有 正 确 的 设 置 这 些 宏 , 此 时 我 们 可 以 用 这 条 指 令 在 编 译 的 时 候 就 进 行 检 查 假 设 我 们 希 望 判断 自 己 有 没 有 在 源 代 码 的 什 么 地 方 定 义 了 _X86这 个 宏 可 以 用 下 面 的 方 法#ifdef _X86 #pragm a m esage(“_X86 m acro activated!”) #endif当 我 们 定 义 了 _X。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.