C语言编译预处理.ppt
《C语言编译预处理.ppt》由会员分享,可在线阅读,更多相关《C语言编译预处理.ppt(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第8章章编译预处理编译预处理8.1宏定义宏定义8.2文件包含文件包含8.3条件编译条件编译8.1宏定义宏定义在在C语言源程序中,允许用一个标识符来表示一个字符串,称语言源程序中,允许用一个标识符来表示一个字符串,称为宏。被定义为宏的标识符称为宏名。在编译预处理时,对为宏。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的程序中所有出现的“宏名宏名”,都用宏定义中的字符串去代换,都用宏定义中的字符串去代换,这称为这称为“宏代换宏代换”或或“宏展开宏展开”。宏分为无参宏和带参宏。宏分为无参宏和带参宏。1.无参宏无参宏无参宏的宏名后不带参数。其定义的一般形式为:无参宏的宏名后不带参数。
2、其定义的一般形式为:#define标识符标识符字符串字符串其中其中“#define”表示这是一条宏定义预处理命令,表示这是一条宏定义预处理命令,“标识符标识符”是所定义的宏名,是所定义的宏名,“字符串字符串”可以是常量、表达式和格式可以是常量、表达式和格式串等。串等。下一页返回8.1宏定义宏定义例例8-1给定圆锥的底圆半径给定圆锥的底圆半径R和高和高H,求圆锥的体积。,求圆锥的体积。#definePI3.14159#defineR5#defineH6#defineCVPvolumeofconeis:main()floatv;v=PI*R*R*H/3.0;printf(%s%fn,cvp,v);
3、上一页 下一页返回8.1宏定义宏定义运行结果:运行结果:volumeofconeis:157.079500说明:说明:宏定义是用宏名来表示一个字符串,在宏展开时则以该字宏定义是用宏名来表示一个字符串,在宏展开时则以该字符串代换宏名,这只是一种简单的替换。字符串中可含任何符串代换宏名,这只是一种简单的替换。字符串中可含任何字符,预处理程序对它不作任何检查。若有错误,只能在编字符,预处理程序对它不作任何检查。若有错误,只能在编译已被宏展开后的源程序时发现。译已被宏展开后的源程序时发现。宏定义不是说明或语句,在末尾不应加分号,否则连分号宏定义不是说明或语句,在末尾不应加分号,否则连分号也一起代换。也
4、一起代换。上一页 下一页返回8.1宏定义宏定义宏定义必须写在函数之外,其作用域为从宏定义命令开始宏定义必须写在函数之外,其作用域为从宏定义命令开始到源程序结束。如要终止其作用域可使用预处理命令到源程序结束。如要终止其作用域可使用预处理命令#undef。宏名习惯上用大写字母表示,以便与变量相区别。但也允宏名习惯上用大写字母表示,以便与变量相区别。但也允许使用小写字母。许使用小写字母。宏名在源程序中若用双引号括起来,则预处理程序不对其宏名在源程序中若用双引号括起来,则预处理程序不对其作宏代换。例如:作宏代换。例如:#definePI3.14159main()printf(PI);printf(n)
5、;上一页 下一页返回8.1宏定义宏定义则运行结果为:则运行结果为:PI这里把这里把“PI”作为字符串处理,因此不作宏代换。作为字符串处理,因此不作宏代换。宏定义允许嵌套。宏定义允许嵌套。在宏定义的字符串中可以使用已经定义的宏名。在宏展开时在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序将作层层代换。例如:由预处理程序将作层层代换。例如:#defineWIDTH80#defineLENGTH(WIDTH+40)其中,第其中,第2个宏定义中使用了第个宏定义中使用了第1个宏定义中的宏名个宏定义中的宏名WIDTH。在执行编译处理时,将程序中的所有在执行编译处理时,将程序中的所有WIDT
6、H都被都被80代换,代换,而所有的而所有的LENGTH都被都被(80+40)代换。代换。上一页 下一页返回8.1宏定义宏定义(7)可用宏定义表示数据类型。可用宏定义表示数据类型。例如:例如:#defineREALfloat这时可用这时可用REAL作单精度实型变量的说明:作单精度实型变量的说明:REALe,f;2.带参宏带参宏C语言允许宏带有参数。在宏定义中的参数称为形式参数,在语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参的宏,在调用中,不宏调用中的参数称为实际参数。对带参的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。实参可以是表达式。仅要宏展开
7、,而且要用实参去代换形参。实参可以是表达式。带参宏定义的一般形式为:带参宏定义的一般形式为:#define宏名宏名(形式参数表形式参数表)字符串字符串上一页 下一页返回8.1宏定义宏定义带参宏调用的一般形式为:带参宏调用的一般形式为:宏名宏名(实际参数表实际参数表);例如:例如:#definePOWER(x)(x)*(x)#defineVOLUME(r,h)3.14159*(r)*(r)*(h)/3.0假设假设x=4;y=6;r=3;h=5;z=POWER(x+y);v=VOLUME(r+2,h+1);上一页 下一页返回8.1宏定义宏定义则经编译预处理宏展开后为:则经编译预处理宏展开后为:z=
8、(x+y)*(x+y);v=3.14159*(r+2)*(r+2)*(h+1)/3.0;说明:说明:带参宏定义中,宏名与形参表之间不能有空格。带参宏定义中,宏名与形参表之间不能有空格。例如:将带参宏定义例如:将带参宏定义#definePOWER(x)(x)*(x)改写成改写成:#definePOWER(x)(x)*(x)上一页 下一页返回8.1宏定义宏定义则被认为是无参宏定义,宏名则被认为是无参宏定义,宏名POWER代表代表(x)(x)*(x),这,这显然是错误的。显然是错误的。在带参宏定义时,应适当加括号,以使意义明确。例如:在带参宏定义时,应适当加括号,以使意义明确。例如:#defineA
9、REA(r)3.14159*(r)*(r)S=AREA(x+5);宏调用时,用实参宏调用时,用实参x+5去代替形参去代替形参r,则宏展开后为:,则宏展开后为:S=3.14159*(x+5)*(x+5);若在宏定义时,若在宏定义时,r不加括号,即不加括号,即#defineAREA(r)3.14159*r*r则宏展开后的语句为:则宏展开后的语句为:S=3.14159*x+5*x+5;因此,为了避免出错,在宏定义中,字符串内形参通常要用因此,为了避免出错,在宏定义中,字符串内形参通常要用括号括起来。括号括起来。上一页 下一页返回8.1宏定义宏定义在带参宏定义中,形参不分配内存单元,因此不必作类型在带
10、参宏定义中,形参不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体值,要用它们代换形参,故定义。而宏调用中的实参有具体值,要用它们代换形参,故必须作类型定义。这与函数不同,在函数中,形参是变量,必须作类型定义。这与函数不同,在函数中,形参是变量,有自己的作用域,调用时要把实参的值传递给形参。而在带有自己的作用域,调用时要把实参的值传递给形参。而在带参宏调用时,只是符号代换,不存在值传递的问题。参宏调用时,只是符号代换,不存在值传递的问题。在宏定义中的形参是标识符,而宏调用中的实参可以是表在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。达式。宏定义也可用来定义多个语句,在宏调用时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 编译 预处理
限制150内