本次内容:编译预处理
教学目的:掌握宏替换方法及应用,文件包含概念及应用。
重点:宏替换、文件包含和头文件
难点:利用宏替换设计头文件
预习,
#define PI 3.1415926
#define R 2.0
double sf()
{
return(PI*R*R);
}
double lf()
{
return(2.0*PI*R);
}
main()
{printf(“s=%lf,l=%lf \n”,sf(),lf();
}
编译预处理:编译前对源程序进行的预加工。按源程序中的预处
理命令进行。
预处理命令:以,#”开头,末尾不加分号,可以出现在程序中任
何位置。
命令作用域:自出现点到源程序末尾。
如,#include,stdio.h”
一、宏替换
宏替换:用预处理命令 #delfine指定的预处理。
1、字符串宏替换
(1)简单替换
#define 宏名 宏体
如,#define PI 3.1415926
double f1()
{
return(2.0*PI*10);
}
特点:易读、易修改。
double f1()
{
return(2.0* 3.1415926 *10);
}
等价
(2)带参替换
#define 标识符(形参表) 宏体
如,#define px( r ) 2.0*PI*( r ) /*前面已定义 PI*/
,
l=px( 10 );
,
特点, * 时间效率高(与函数比)
* 只是简单字符替换,不进行计算(函数参数可计算)
*副作用( P132)
2、书写 #define注意问题
(1)宏名与宏体间加空格
如,#define PI 3.1415926
(2)宏名不能用引号括起来
如,#define,PI” 3.1415926 是错误的
(3)较长定义可在尾用“、”结束以示续行
如,#define PRX printf(“Shanxi Economic \
Management University”)
(4)带参宏定义,各参数用括号括起来
如,#define SQU(x) ((x)*(x))
(5)宏定义可写在源程序的任何地方,但要写在应用之前,也可多
个宏定义集中在一个文件中(头文件)。
如:将如下内容保存于 inci.h文件中。
#define I1 1
#define I2 2
#define I3 3
编辑方法同,c 文件,保存时要加扩展名,h 。
如下程序中引用
#define,inci.h”
main()
{
printf(“%d \t%d\t%d\n”,I1,I2,I3);
}
结果,1 2 3
(6)已定义的宏可用 #define撤消。
如,define OK 1
,
define OK /*撤消了 OK的宏定义 */
二、文件包含
文件包含:通过 #include把已进入系统的另一个文件的整个内容
嵌进来。
格式 1 #include,文件标识”
标识符中含有文件路径。预处理程序先在原来的源文件目录中检
索该指定的文件;如果未找到,则再按标准方式检索其它文件目
录,直到找到为止。
格式 2 #include <文件名 >
预处理程序只按标准方式检索文件目录。
文件包含是一种模块化程序设计的手段,在程序设计时,可以把
一批具有公用性的宏定义、数据结构及函数说明集中起来,单独
构成一个文件。如 P135_图 4.13。
小结,
1、宏替换
2、文件包含
作业,
P141_4.17,4.18
课堂练习,
输出如下图形。
*
**
***
****
*****
*****
****
***
**
*
*
***
*****
*******
*********