第14章预处理器.ppt

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第14章预处理器

14.4 条件编译 C语言的预处理器可以识别大量用于支持条件编译的指令。 这个功能能够使预处理器根据条件测试结果来决定包含或排除程序中的一些片断。 14.4.1 #if指令和#endif指令 假如我们正在调试一个程序,我们想要程序显示出特定变量的值,因此将 printf函数调用添加到程序中重要的部分。 一旦找到错误,经常需要保留这些 printf函数调用,以备以后使用,条件编译允许我们保留这些调用,但是让编译器忽略它们。 首先定义一个宏,并给它一个非 0的值: #define DEBUG 1 接下来,我们要在每组 printf函数调用的前后加上#if和#endif: #if DEBUG printf(Value of i: %d\n, i); printf(Value of j: %d\n, j); endif #if指令和#endif指令 在预处理过程中,# if指令会测试 DEBUG的值。 由于 DEBUG的值非0,因此预处理器会将这两个 printf函数调用保留在程序中(但#if和#endif行会消失)。 如果我们将 DEBUG的值改为 0并重新编译程序,预处理器则会将这 4行代码都删除。 我们可以将#if-#endif保留在最终的程序中,这样如果程序在运行时出错,可以继续产生这些诊断信息(将 DEBUG改为 1并重新编译)。 #if指令和#endif指令 一般来说,#if指令的格式如下: #if constant-expression … #endif 当预处理器遇到#if指令时,会计算常量表达式。 如果表达式的值为0,那么在# if与 #endif之间的行将在预处理过程中从程序中删除。 否则,这些在# if和#endif之间的行会被保留在程序中,并继续被编译器处理——这时#if和#endif对程序没有任何影响。 #if指令和#endif指令 对于没有定义过的标识符,#if指令会把它当作是值为 0的宏对待。 如果我们没有定义 DEBUG, 则测试: #if DEBUG 将会失败(但不会产生错误消息)。 而测试: #if !DEBUG 则会成功。 * defined运算符 14.3节介绍了#和##运算符,还有一种预处理器运算符:defined 如果标识符是一个定义过的宏则返回1,否则返回0。 defined运算符通常与#if指令结合使用。 #if defined(DEBUG) … #endif 仅当 DEBUG被定义成宏时,# if和#endif之间的代码会被保留在程序中 DEBUG两侧的括号不是必需的,因此可以简单写成: #if defined DEBUG 也不必给 DEBUG 一个值: #define DEBUG 14.4.3 #ifdef指令和#ifndef指令 #ifdef指令测试一个标识符是否已经定义为宏: #ifdef identifier 其效果与此语句相同: #if defined(identifier) #ifndef 指令测试一个标识符当前是否未被定义为宏: #ifndef identifier 其效果与此语句相同: #if !defined(identifier) 14.4.4 #elif指令和#else指令 #if, #ifdef, 和 #ifndef 可以像普通if语句一样嵌套。 当出现嵌套时,采用缩进来表示不同的嵌套层次是比较好的实践。 某些程序员在每个#endif后面留注释来表明所匹配的测试条件: #if DEBUG … #endif /* DEBUG */ #elif指令和#else指令可以与#if指令、#ifdef指令和#ifndef指令组合使用,来测试一系列条件: #if expr1 当表达式 1非 0时需要包含的代码 #elif expr2 当表达式 1为 0但表达式 2非 0时需要包含的代码 #else 其他情况下需要包含的代码 #endif 在#if指令和#endif指令之间可以有多个#elif指令,但最多只能有一个#else指令。 第14章 本章要点 预处理器的工作原理 预处理指令 宏定义 条件编译 引言 指令如#define 和#include 等是由预处理器进行处理的,而预处理器是一个在编译前编辑C程序的软件. C语言(和 C++语言)因为依赖预处理器而不同于其他的编程语言。 预处理器是一个强大的工具,但它同时也可能是许多难以发现的错误的根源。 14.1 预处理器的工作原理 预处理器查找以#开头的预处理指令. 前面,我们已经遇到过#define 和#include指令. #define 指令定义一个宏( macro)—即一个能够代表其它东西的名字,比如一个常量。 预处理器会通过将宏的名字和它的定义存储在一起来响应#define指令。 当这个宏在

文档评论(0)

liudao + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档