1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,*,页,C,语言程序设计,第,8,章 编译预处理,第,8,章 预处理命令,本章概述,本章的学习目标,主要内容,本章概述,本章介绍宏定义的两种形式,介绍文件包含的使用方法,介绍条件编译的概念。,第8章 预处理命令,本章的学习目标,:,本章教学目的:掌握宏定义的两种形式,掌握文件包含的使用方法了解条件编译的概念。,本章教学重点:宏定义的两种形式,文件包含的使用方法。,本章教学难点:带参数的宏定义。,第,8,章 预处理命令,第8章 预处理命令,8.1 宏定义,8.2 “文件包含”处理,8.3 条件编译,8.4 本
2、章小结,主要内容,:,编译预处理是指一些行首以,#,开头的特殊语句,必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理(例如,若程序中用,#define,命令定义了一个符号常量,A,,则在预处理时将程序中所有的,A,都置换为指定的字符串)。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。,C,语言与其它高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。,第,8,章 预处理命令,C提供的预处理功能主要有以下三种:,宏定义、文件包含和条件编译,它们分别用宏定义命令
3、文件包含命令和条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“”开头。,8.1,宏定义,宏定义指的是用,#define,定义的命令行,有不带参数和带参数两种形式。,8.1.1 不带参数的宏定义,不带参数的宏定义的一般形式为:,#define,标识符,字符串,含义是用指定的宏名(即标识符)来代表其后字符串。,例如,:,#define SIZE 10000,#define PI 3.1415926,#define FORMAT “%d,,,%d,,,%dn”,作用是指用标识符,SIZE,来代替字符串“,10000,”,,用标识符,PI,来代替字符串“,3.1415926,”,,用标识
4、符,FORMAT,来代替字符串“,“%d,,,%d,,,%dn”,”,,在编译预处理时,将程序中在该命令以后出现的所有的,SIZE,用,10000,代替、,PI,用,3.1415926,代替、,FORMAT,用,“%d,,,%d,,,%dn”,代替。这种方法使用户能以一个简单的名字代替一个长的字符串,可以减小重复编程工作量,而且不容易出错。,把定义时所用的标识符称为“宏名”,即,SIZE,、,PI,和,FORMAT,都是宏名。在预编译时将宏名替换成字符串的过程称为“宏展开”。,注意:宏名习惯用大写字母表示。定义宏与定义变量含义不同,宏定义只是作字符替换,并不给宏名分配内存空间。,例8.1,#i
5、nclude,#define SIZE,5,int main(),int i,sum=0;,int dataSIZE;,for(i=0;iy)?x:y;,main(),int a,b,c,d,t;,t=max(a+b,c+d);,用宏:,#define MAX(x,y)(x)(y)?(x):(y),main(),int a,b,c,d,t;,t=MAX(a+b,c+d);,赋值语句展开后为,t=(a+b)(c+d)?(a+b):(c+d);,8.2,“,文件包含”处理,C,语言提供了,#include,命令,用来实现“文件包含”的操作。作用是将一个源文件的全部内容包含进另一个源文件中来。,被包
6、含的文件可以是,C,语言源文件、库函数头文件等。因为,#include,命令行通常都放在文件的开头,所以这些被包含的文件通常被称为“标题文件”或“头文件”,常以“,.h”,(,h,为,head,的缩写)为文件的扩展名。当然也可以用其他文件扩展名,但无论用什么扩展名,这个被包含文件必须是文本文件。,C,集成环境为用户提供了很多,库函数,,每一个库函数都有自己对应的,头文件,,在,C,语言库函数与用户程序之间进行信息通信时,要使用一些库函数中定义的数据和变量,在使用某一库函数时,都要在程序中,使用,#include,命令将该函数所对应的头文件包含进来,,否则,程序在编译时报错。,文件包含的使用格式
7、为:,include,“,文件名”,或,include,文件名,其中的“文件名”和,的区别是:当使用“文件名”,形式时,预处理程序首先检索当前文件目录是否有该文件,如果没有,再检索,C,编译系统中指定的目录;而使用,形式时,预处理程序直接检索,C,编译系统指定的目录。使用“”时,格式文件包含名可加路径。,例如:,#include“d:tcincludestdio.h”,常用的标准库头文件的扩展名都是,h,,如:,#include /*,标准输入输出函数文件,*,/,#include /*,字符串函数文件,*,/,#include /*,字符函数文件,*,/,#include ,/*,数学函数库
8、文件,*,/,“文件包含”命令可以节省程序设计人员的劳动。例如,可以将经常使用一组固定的符号常量,(g=9.81,pi=3.1415926,e=2.718,等等,),用宏定义命令组成一个文件,只要用,#include,命令这个文件包含到自己所写的源文件中即可。,正确的使用,#include,语句,将会减少不必要的重复工作,提高编程效率。特别是在一个软件开发小组共同协作开发大型软件时,,include,文件十分有用,利用它可以定义程序中共同的常量、函数原型、宏等,这样可以便于修改且不易出错。,例,8.5,编制如下内容的被包含文件,将其拷贝到,C,语言目录中。该文件名为,bj.h,。,#defin
9、e START ,#define OK ,#define MAX(x,y)xy?x:y,编写另一程序,file.c,,内容如下:,#include,#include “bj.h”,int main(),START,double x=500.0,y=100.0;long lx=25,ly=37;,printf(“double MAX=%lfn”,MAX(x,y);printf(“long MAX=%ldn”,MAX(lx,ly);,return 0;,OK,注意:在编译时并不是作为两个文件进行连接的,而是作为一个源程序编译,得到一个目标,(.obj),文件。,执行程序,file.c,,结果显示如
10、下:,double MAX=500.000000,long MAX=37,说明:,(1),如果要包含,n,个文件,必须用,n,个,include,命令。即一个,include,命令只能指定一个被包含文件。,(2),假设,“wj1.c”,、,“wj2.c”,、,“wj3.c”,是三个不同的文件,若在,“wj1.c”,有如下两行命令:,#include ,#include ,则在文件,“wj1.c”,中可以用,“wj2.c”,和,“wj3.c”,的内容,在文件,“wj2.c”,中可以用,“wj3.c”,的内容,不必在文件,“wj2.c”,中再使用“,#include ,”命令。,若在“wj1.c”
11、中只有“#include,”命令,而“wj1.c”中又要使用“wj3.c”的内容,也可以让“wj2.c”中出现“#include ”命令。即文件包含可以嵌套使用。,例,8.4,/*file.c*/,#include ,#include “myfile.txt”,int main(),fun();,return 0;,myfile.txt,文本文件内容如下,void fun(),char c;,if(c=getchar()!=n),putchar(c);,fun();,在编译,file.c,时,预处理过程中用,myfile.txt,文件的文本替换,file.c,中的,#include“myfil
12、e.txt”,,,因此本例程序功能是接受用户的按键,直到按回车键为止,然后将字符序列显示出来。,8.3 条件编译,有时希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句,使得同一个源程序在不同的编译条件下能够产生不同的目标代码文件。这就是“条件编译”。,条件编译命令有以下,3,种形式:,1、,#ifdef 标识符,程序段1,#else,程序段2,#endif,作用:当标识符已经被定义过(一般是用define命令定义),则对程序段1进行编译;否则编译程序段2。,其中(#else 程序段2)可以没有。,作用:若标识符未被定义,则编译程序段,1,;否则编译程序段,2,。,2、#i
13、fndef 标识符,程序段1,#else,程序段2,#endif,3、#if,表,达式,程序段1,#else,程序段2,#endif,作用:当指定的表达式值为真(非零)时编译程序段,1,;否则编译程序段,2,。,#include,#define TERM 0,int main(),int i,a10;float s=0,t=1;,for(i=0;i10;i+),scanf(“%d”,#if TERM,for(i=0;i10;i+),t=t*ai;,printf(%f,t);,#else,for(i=0;i10;i+),s=s+ai,;,printf(%f,s);,#endif,return 0;,执行程序,若输入如下,10,个数:,1 2 3 4 5 6 7 8 9 10,输出结果为:,55.000000,若将程序中的,“,#define TERM 0”,改为,“,#define TERM 1”,,,同样输入上面的,10,个数,程序运行的输出结果为:,3628800.000000,例,8.5,输入,10,个整数,根据需要设置条件编译,能够求,10,个整数的和,或求,10,个整数的积。,8.4 本章小结,本章介绍了宏定义的两种形式,介绍了文件包含的使用方法,介绍了条件编译的概念。,






