C程序设计 主讲教师:汪闽 南京师范大学 地图学与地理信息系统04级 专业选修课
C程序设计 南京师范大学 地图学与地理信息系统04级 专业选修课 主讲教师: 汪闽
第八章编译预处理 8.1宏定义 8.2文件包含 8.3条件编译
第八章 编译预处理 8.1 宏定义 8.2 文件包含 8.3 条件编译
作用:对源程序编译之前做一些处理生成扩展C 源程序 >种类 宏定义# define 文件包含# Include 条件编译#if-+#else-# endif等 格式: “#开头 占单独书写行 语句尾不加分号
– 作用:对源程序编译之前做一些处理,生成扩展C 源程序 ➢种类 • 宏定义 #define • 文件包含 #include • 条件编译 #if--#else--#endif等 – 格式: • “#”开头 • 占单独书写行 • 语句尾不加分号
8.1宏定 宏体可缺省,表示宏名 定义过或取消宏体 8.1.1不带参数宏定义 一般形式:# define宏名[宏体] 功能:用指定标识符(宏名)代替字符序列(宏体) 定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 # undef可终止宏名作用域 格式:# undef宏名 宏展开:预编译时,用宏体替换宏名--不作语法检查 引号中的内容与宏名相同也不置换 宏定义可嵌套,不能递归 例# efine maX max+10 宏定义中使用必要的括号()
8.1.1 不带参数宏定义 • 一般形式: #define 宏名 [宏体] • 功能:用指定标识符(宏名)代替字符序列(宏体) 宏展开:预编译时,用宏体替换宏名---不作语法检查 宏体可缺省,表示宏名 定义过或取消宏体 定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 #undef可终止宏名作用域 格式: #undef 宏名 宏定义可嵌套,不能递归 例 #define MAX MAX+10 () 引号中的内容与宏名相同也不置换 宏定义中使用必要的括号() 8.1 宏定义
8.1.2带参数宏定义 一般形式:#efne宏名(参数表)宏体 例# define s(ab)a” 不能加空格 area=S(3, 2) 宏展开: area=3 *2 宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号() 例 D大大 相例# efine power(x)X*x X=4;y=6; Z=POWER(X+y) 宏展开:z=+y*Xty 般写成:# define PoWer(x(×)*(×) 宏展开:z=(X+y)*(xy);
• 一般形式: #define 宏名(参数表) 宏体 例 #define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r” 宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号() 例 #define S(a,b) a*b ……….. area=S(3,2); 宏展开: area=3*2; 不能加空格 例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) ((x)*(x)) 宏展开: z=((x+y)*(x+y)); 8.1.2带参数宏定义
例用宏定义和函数实现同样的功能 #define MAX(x, y)(x)>(y)?(x): (y) int max(int x, int y) i return(xy?x y) main i int a, b, c, d, t main i int a, b, c, d, t t=MAX(a+b, c+d) t=max(a+b, c+d) 宏展开:t=(a+b)>(c+o?(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); int max(int x,int y) { return(x>y?x:y); } main() { int a,b,c,d,t; ……. t=max(a+b,c+d); ……… } 例 用宏定义和函数实现同样的功能
带参的宏与函数区别 带参宏 函数 处理时间编译时 程序运行时 参数类型无类型问题 定义实参形参类型 处理过程不分配内存 分配内存 程序长度变长 不变 运行速度不占运行时间 调用和返回占时间
带参宏 函数 处理过程 不分配内存 简单的字符置换 分配内存 先求实参值,再代入形参 处理时间 编译时 程序运行时 参数类型 无类型问题 定义实参,形参类型 程序长度 变长 不变 运行速度 不占运行时间 调用和返回占时间 带参的宏与函数区别
8.2文件包含 功能:一个源文,标准日录报索 先在当前目录搜索,再搜索标准目 包含进来 可指定路径 一般形式:# include“文件名” 或# include<文件名 处理过程:预编译时,用被包含文件的内容取代该预处理命 令,再对“包含”后的文件作一个源文件编译 # include“fle2.c file2.c A file2.c filel.c filel.c
– 功能:一个源文件可将另一个源文件的内容全部 包含进来 – 一般形式: #include “文件名” 或 #include #include “file2.c” file1.c file2.c file1.c file2.c A B A 处理过程:预编译时,用被包含文件的内容取代该预处理命 令,再对“包含”后的文件作一个源文件编译 <> 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录 可指定路径 8.2 文件包含
被包含文件内容 file3. c 源文件(*c) file2.c 宏定义 头文件(*h) filel.c 数据结构定义 A 文件包含可嵌套 函数说明等 # include“fie2c”|# include“fle3c” A B file3 filel.c file2.c
• 源文件(*.c) • 头文件(*.h) 宏定义 数据结构定义 函数说明等 文件包含可嵌套 #include “file2.c” file1.c A file3.c C #include “file3.c” file2.c B file1.c A file3.c file2.c 被包含文件内容
例文件包含举例 powers h * #define sqr(x)((x)*(x)) #define cube(x)((x)*(x)(x) #define quad(x)((x)*(x)*(x)*(x)) /*ch810c*/ #include #include"d: fengyi bkclpowers h #define maX poWer 10 void main Int n printf("number it exp2 \t exp t exp4 n") print atf( n"); for(n=l; n<=MAX POWER; n++) printf( %2d t%3dt%4dt %5dn" n, sqr(n), cube(n), quad(n))
/* powers.h */ #define sqr(x) ((x)*(x)) #define cube(x) ((x)*(x)*(x)) #define quad(x) ((x)*(x)*(x)*(x)) /*ch8_10.c*/ #include #include "d:\fengyi\bkc\powers.h" #define MAX_POWER 10 void main() { int n; printf("number\t exp2\t exp3\t exp4\n"); printf("----\t----\t-----\t------\n"); for(n=1;n<=MAX_POWER;n++) printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n)); } 例 文件包含举例