文档介绍::返回目录了解预处理命令的基本概念和作用。掌握C语言中宏定义的形式与使用,理解宏定义与函数调用之间的差别。掌握文件包含、条件编译等预处理命令的使用。以“#”号开头的命令,被称为“编译预处理”命令。C语言中编译预处理主要包括宏定义、文件包含、条件编译等。所谓预处理,是指在进行编译的第一遍扫描(即词法扫描和语法分析)之前所要做的工作,它由预处理程序完成。当我们对源文件进行编译时,系统首先自动启用预处理程序,对源程序中的预处理部分进行处理,然后才对源程序进行编译。由此可见,预处理命令不是实现程序的功能,而是给C语言编译系统提供信息,通知C编译器在对源程序进行编译之前应该做哪些预处理工作。预处理命令是由ANSIC统一规定的,但它并不是C语言本身的组成部分,更不是C语言的语句,为了与其他C语句相区别,所有的预处理命令都以符号“#”开头,书写时单独占一行,且末尾不加分号。在源程序中,预处理命令通常放在函数之外的源文件起始部分。概述(1)返回目录预编译功能是C语言特有的,合理地使用预处理命令,不但可以提高编程的效率和程序的可读性,而且便于修改、移植和调试程序,增加程序的灵活性,有助于实现结构化程序设计。本章主要介绍宏定义与引用、包含文件处理、条件编译命令。返回目录概述(2)在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。为了区别于一般的变量名、数组名、指针变量名,宏名通常用大写字母表示。宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在C语言中,“宏”分为无参宏和带参宏两种。(1)无参宏的宏名后不带参数。其定义的一般形式为:#define标识符字符串其中:“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。当定义了宏名后,在源程序中就可以引用这个宏名了。源程序开始编译前,编译预处理程序将会把源程序清单中所有引用的宏名替换成对应的字符串,然后再编译源程序。例如:###defineSPI*R*R…floatx=S;预编译后,语句“floatx=S;”将被展开替换为:floatx=**;不难看出,。返回本节目录说明:宏名通常用大写字母表示,且其前后应有空格,以便准确地辨认宏名。本命令不是语句,其后不能有分号(;)。如果有分号则连分号也一起替换。宏替换只是简单的字符替换,并不进行任何语法检查。如有错误,只能在编译已被宏展开后的源程序时才能被发现。如将上面的“#”改为“#;”,则语句“floatx=S;”将被展开替换为:floatx=;**;编译时将出现语法错误。在字符串中若出现运算符,要注意替换后的结果,通常需在合适的位置加括号。例如:将上面的“#”改为“#+”时,语句“floatx=S;”将被展开替换为:floatx=*+*+;显然运算结果不符合原意。若将宏定义改为:“#defineR(+)”,语句“floatx=S;”将被展开替换为:floatx=*(+)*(+);这样运算结果才是正确的。宏定义也有作用域,它的作用域是从开始定义处到本程序的末尾。所以一般都将宏定义放在源程序开头。如果要中止其作用域,可使用“#undef”命令取消宏定义,格式如下:#(2)返回本节目录由于#undefPI的作用,使PI的作用域在#undefPI行处终止,因此在f函数中,。这样可以灵活控制宏定义的作用范围。(3)返回本节目录对出现在源程序字符串中的宏名,预处理时不对其作宏替换操作。例如:#=;…Printf("S=PI*r*r=%f\n",PI*r*r);输出结果是:S=PI*r*r=,而不是s=*r*r=。使用宏定义,可以简化