轻松学C之预处理和宏x

轻松学C之预处理和宏x

ID:38726622

大小:2.36 MB

页数:57页

时间:2019-06-18

轻松学C之预处理和宏x_第1页
轻松学C之预处理和宏x_第2页
轻松学C之预处理和宏x_第3页
轻松学C之预处理和宏x_第4页
轻松学C之预处理和宏x_第5页
资源描述:

《轻松学C之预处理和宏x》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第15章预处理和宏程序在编译之前先要经过预编译阶段。预编译的任务是根据程序中的宏指令补充和完善源代码。有了宏指令,可以使得某些源代码编辑任务变得轻松,同时也可以控制哪些源代码需要编译,哪些不需要编译。15.1预处理概述预处理器是专门用来处理宏指令的程序。在编译器运行之前,会先运行预处理器,查找所有的预处理指令。预处理指令以“#”开头,而且不以“;”结束,以区别于一般的语句。预处理器根据预处理指令生成新的源代码文件(临时文件,可以通过编译器的选项输出到指定目录中)。编译器的作用是把源代码转换成汇编语言或机器指令。但是,编译器并不是直接编译程序员写成的源文件,而是编译经预

2、处理器处理后所产生的新的源文件。这些新的源文件经过编译器生成目标文件,再经过链接器生成最终的可执行程序。预处理器的任务就是执行源代码中的预处理指令,并对源代码进行相应的处理。因此,从预处理指令的类型来讲,预处理器的任务有这几部分:将其他文件包含到当前文件中、定义宏、定义类似函数的宏、实施条件编译。接下来,将详细介绍预处理器的各项任务。15.2宏所谓宏,是程序中定义的用于替换复杂文本的简短文本。宏定义的一般格式如图15-1所示:图15-1宏的定义宏名,即宏的名称,在预编译时被可替换文本替换。可替换文本,即宏名所指代的文本内容。在#define、宏名和可替换文本之间用空格

3、(制表符)分隔。预编译程序将#define之后的第一个和第二个空格之间的文本作为宏名,其后所有文本作为“可替换文本”,而不管中间有多少个空格。15.2.1宏展开在程序的预编译期,预编译程序会解析源代码文本,执行替换源程序的动作,把宏引用的地方替换成定义处的文本。这个动作叫做宏的展开。图15-2这段程序是宏的一个简单例子。图15-2宏的使用上图代码中cout后面的NUMBER在预编译时会被替换成100。注意:在源代码文本中,并不是所有的宏名出现的地方都会进行展开。如果这个宏名出现在一个双引号中,则该宏名就成了字符串的一部分,也就不会进行展开了。15.2.2替代常量用宏替

4、代字面常量,其好处是直观、简洁、修改方便。譬如对于圆周率,其值是一个无理常量3.1415926···。如果在程序中每一处要使用圆周率的地方都直接书写这个常量,那么源代码修改起来就不大方便。一旦要求改变数字的精度,则所有使用的地方都要修改。无疑修改量就比较大,而且也不能保证每一处都修改对。如果使用宏替换字面常量,而程序中使用圆周率的地方都使用宏而非圆周率本身,那么当修改圆周率数值时,只要修改这个宏定义即可,大大减少了编程人员的工作量。例如图15-3所示代码,用宏替换常量3.1415926。图15-3宏替换字面常量上图中使用宏PI替换了常量3.1415926,若程序中的常

5、量需要变化,则只需要更改宏定义即可。相对于常量,使用宏也有缺点。字面常量在编译时处理,有类型信息。而宏则是在预编译时展开,只是进行单纯的文本替换,没有类型信息。因此对于一些类型要求比较严格的地方,使用宏有一定的风险。定义宏时可以使用前面已经定义的宏。例如:假设已经存在一个宏NUMBER,其替换的文本是100,当定义新的宏时,可以在宏的可替换文本中使用NUMBER,如图15-4所示。图15-4宏展开15.2.3替代运算符除了可以用宏替代字面常量,还可以用宏替代某些运算符,包括加减乘除、逻辑与和逻辑非等,甚至函数和语句块的花括号。利用这些宏定义,可以编写出貌似违反C++语

6、法、但实际上合法的源代码。例如:如图15-5所示的代码。图15-5宏替代运算符15.3带参数的宏简单的宏定义,如上节例子所示,只能进行简单的文字替换,扩展能力有限。如果宏能够像函数那样带有参数,并根据参数的不同自动展开成不同的文本,则宏的扩展能力将大大提高。实际上,在C++标准中,可以利用预处理命令#define定义带参数的宏。15.3.1定义带参数的宏有参数宏的宏名后需要带参数,其语法格式如图15-6所示:图15-6带参数宏的定义1若可替换文本一行写不完,可以分成多行,并在每一行的末尾加上分行的符号“”(除了最后一行)。其语法格式如图15-7所示:图15-7带参数

7、宏的定义2注意:要定义带参数的宏,则在宏名和左括号之间不能有空格(或制表符),否则就成了普通的宏定义,括号及其里面的内容也将会成为可替换文本的一部分。但是,在括号中的各个参数之间可以任意添加空格。在可替换文本中可以引用括号中的参数,从而根据参数的不同,展开成不同的源代码文本。例如,下例定义了一个宏,接受两个参数,然后比较两个参数的大小,并输出其中的较小值,示例代码如图15-8所示。图15-8带参数的宏注意:在上述例子中使用了带参数的宏LESS,但是在语句的结尾处并没有分号。乍一看好像不符合C++的语法规范,但是实际上并没有错。这是因为宏是在预编译时处

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。