欢迎来到天天文库
浏览记录
ID:59212955
大小:157.50 KB
页数:46页
时间:2020-09-26
《第9章 编译预处理ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、预处理ANSIC规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编译效率,这些命令是由ANSIC统一规定的,并不是C语言本身的组成部分,不能直接对他们进行编译(编译系统不能识别他们)。在编译前先对程序中的这些特殊命令进行“预处理”,C提供的预处理功能主要有以下三种1、宏定义2、文件包含3、条件编译,为了与一般C语句相区别,这些命令以“#”开头。例子#definePI3.14159#includevoidmain(){floats,r=4.0;s=PI*r*r;printf("s=%f",s);}在C语言源程序中允许用一个标识符来表示一个字符串,称
2、为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。下面分别讨论这两种“宏”的定义和调用。9.1.1无参数的宏定义无参数宏的宏名后不带参数。其定义的一般格式为#define宏名字符串#definePI3.1415926其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“宏名”为所定义的宏名(PI)。“字符串”可以是常数、表达式和格式
3、串等。在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义(现实意义)。1.无参数宏定义符号常量符号常量用无参数的宏定义语句定义,把符号常量名定义为指定的字符串,将程序中出现宏名的地方均用该字符串来替换。在进行编译预处理时,用该字符串替代程序中出现的符号常量名。例如:#defineTRUE1#defineFALSE0把TRUE定义为1,把FALSE定义为0。在符号常量定义之后,就可以用它来编码了。例如:if(i==TRUE)printf("youareright!");elseif(i==FALSE)printf("youarewrong!"
4、);对于该程序段,在进行编译预处理时,就把程序中出现的TRUE和FALSE分别用1和0替代,于是就变为if(i==1)printf("youareright!");elseif(i==0)printf("youarewrong!");在符号常量定义语句中,字符串可以是一个数值型数据、表达式或字符串。例如:#definePI3.1415926#defineS(PI*r*r)#definePRTprintf#defineA(20-(3*4))如果字符串是一个运算表达式,一般应该用括号括住它,以便把它视为一个操作对象与其他操作数进行运算,否则,会由于操作优先级问题而发生错误。例如:te
5、xt=A*8;进行编译预处理后,该表达式变为text=(20-(3*4))*8;如果A定义为#defineA20-(3*4)则表达式text=A*8经预编译后变为text=20-(3*4)*8;这就不符合原意。因此,在宏定义语句中的字符串为一般表达式(而不是一个操作数)时,为了保证正确的运算次序,应该用括号括住它。因此在宏定义时必须十分注意,应保证在宏代换之后不发生错误。3.无参数宏的注意事项使用无参数宏定义符号常量时,一般应注意以下几点。(1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理
6、程序对它不作任何正确性检查。如有错误,则只能在编译已被宏展开后的源程序时发现。(2)符号常量名一般用大写字母(也可以用小写字母)表示,以便与其他标识符相区别。符号常量名的命名规则与一般标识符相同。另外,应考虑在字符串中根据需要加上括号。(3)宏定义不是说明或语句,因此,不能用分号结尾。如果加上分号,则分号被作为字符串的一部分,连分号也一起置换。例如:#defineA60;上面的格式表示A被定义为“60;”,而不是“60”。于是,在预编译时,程序中凡是出现A的地方,都用“60;”替换。这就不符合原意了。(4)替换字符串可以为空。(5)宏定义语句应放在函数定义之外,符号常量的有效范围是从定义
7、它的宏定义语句开始至所在源文件的结尾。一般宏定义语句都放在源文件的开头,以便使它对整个源文件都有效。(6)为了灵活控制宏定义的作用范围,可用“﹟undef”命令终止宏定义的作用域。例如:#definePI3.14159main(){}#undefPI/*PI的宏定义结束*/f1(){}表示PI只在main函数中有效,在f1中无效。(7)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如:#
此文档下载收益归作者所有