您好,欢迎访问三七文档
第9章编译预处理•编译预处理的含义•宏定义和宏替换•文件包含•条件编译9.1编译预处理C语言提供的编译预处理命令主要有以下三种:宏定义命令、文件包含命令和条件编译命令。为了与一般C语言语句相区别,预处理命令必须以符号“#”开头,一个预处理命令单独占一行,每行的末尾不得加“;”号,以区别于C语句。9.2宏定义和宏替换在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为“宏替换”或“宏展开”。9.2.1符号常量的宏定义用一个指定的标识符来代表一个字符串,其定义的一般形式为:#define标识符字符串这里,#define表示是宏定义命令。例如:#definePI3.1415功能是定义一个符号常量(宏名)PI代替字符串3.1415。例9.1宏定义的使用#defineNAMEWelcometouseC./*NAME是宏名*/main(){printf(NAME);}程序运行结果:WelcometouseC.使用宏定义的说明:(1)宏名一般用大写字母表示,变量名通常用小写字母表示,但并非是规定。(2)宏展开时将宏名替换为字符串,可以是常数,也可以是表达式,预处理程序对它不作任何检查。(3)宏定义不是语句,在行末不必加分号,如加上分号则连分号也一起替换。4)在宏定义和宏替换时,可以使用已经定义的宏名。例9.3使用已定义的宏定义。#defineA2#defineB3#defineS(A+B)*2/*A,B是已定义的宏名*/main(){printf(Theresultis:%d\n,S);}程序运行结果:Theresultis:109.2.2带参数的宏定义C语言允许宏带有参数。带参数的宏定义一般形式为:#define宏名(参数表)字符串其中的字符串中含有参数表中所指定的参数。带参数的宏调用的一般形式为:宏名(实参表);例9.5从键盘上输入两个数据,比较大小并输出较大的数,定义宏实现。#defineMAX(x,y)(xy)?x:ymain(){inta,b,max;printf(PleaseInputa,b:);scanf(%d%d,&a,&b);max=MAX(a,b);printf(Max=%d\n,max);}程序运行结果:PleaseInputa,b:1020Max=209.3文件包含文件包含是指一个源文件可以将另外一个源文件的全部内容包含进来。其命令的一般形式如下所示:#include文件名或#include文件名其中,文件名是被包含文件的文件名,它是一个磁盘文件。9.4条件编译预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。条件编译命令有以下几种形式。1.第1种形式#ifdef标识符程序段1#else程序段2#endif9.4条件编译2.第2种形式#ifndef标识符程序段1#else程序段2#endif与第一种形式的区别是将“ifdef”改为“ifndef”。9.4条件编译3.第3种形式#if常量表达式程序段1#else程序段2#endif功能:如常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。其中的else部分可以省略。例9.12输入一行报文,将报文原码输出,或仅输出相同个数的星号“*”#defineCHANGE1/*预置为输出星号*/#includestring.hmain(){intlen,i;charstr[20];printf(\nPleaseinputthemessage:);gets(str);#ifCHANGE/*输出星号*/for(i=0;istrlen(str);i++)printf(*);#else/*输出原文*/printf(Themessageis:%s\n,str);#endif}程序执行结果:Pleaseinputthemessage:Hello*****如果将程序第一行改为:#defineCHANGE0则在预处理时,对程序段2进行编译处理,将报文原样输出9.5本章小结宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏替换时用该字符串代换宏名。宏定义可以带有参数,宏替换时是以实参代换形参,而不是“值传送”。为了避免宏替换时发生错误,宏定义中的字符串应加括号。文件包含是指一个源文件可以将另一个源文件包含进来,它可用来把多个源文件连接成一个源文件进行编译,生成一个目标文件。使用标准库函数时,要注意将其头文件包含进来。9.6思考练习题一、思考题二、选择题三、填空题四、编程题见P213页
本文标题:第9章编译预处理
链接地址:https://www.777doc.com/doc-3866811 .html