九章预处理命令.ppt
第九章 预处理命令九章预处理命令 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望第九章 预处理命令9.1 宏定义宏定义9.1.1 不带参的宏定义不带参的宏定义1.形式:#define 标识符 字符串例#define PRICE 30#define NUMBER 10#define TOTAL PRICE*NUMBER main()printf(“TOTAL=%dn”,TOTAL);预编译后,程序为:main()printf(“TOTAL=%dn”,30*10);第九章 预处理命令2.说明:(1)不带参的宏常用来定义符号常量。(2)同一宏名可被重复定义,以最后的定义为准。(3)宏定义时,可引用已定义的宏名,层层置换。(4)宏展开时,只做简单的宏替换,不做任何语法检查或运算。(5)双引号内的宏名不被置换。(6)宏名的有效范围是从定义开始到文件结束,可用命令“#undef 标识符”来终止作用域。(7)一个命令只定义一个宏。第九章 预处理命令9.1.2 带参的宏定义带参的宏定义1.形式:#define 宏名(参数表)包含参数的字符串例 若有宏定义:#define s(a,b)a*b 且使用该宏:area=s(3,2);则预编译后,宏展开为:area=3*2;2.宏如何展开#define s(a,b)a*b area=s(3,2);3*2第九章 预处理命令例#define PI 3.14#define s(r)PI*r*r main()float a=3.6,area;area=s(a);/*area=3.14*3.6*3.6;*/printf(“area=%fn”,area);若main函数改为:main()float a=3.6,b=6.4,area;area=s(a+b);/*area=3.14*3.6+6.4*3.6+6.4;*/printf(“area=%fn”,area);第九章 预处理命令3.说明:(1)带参宏展开时,只是用实参简单地替换形参,并不会计算出实参值。(2)宏定义时,包含参数的字符串中的参数外面最好加一括弧。如:#define s(r)PI*(r)*(r)(3)带参宏定义时,宏名与括号之间不能加空格。若有定义:#define s (r)PI*r*r 则变为无参宏,展开为:area=(r)PI*r*r(a);4.函数与带参宏的区别:(1)函数调用时,要先自右而左计算出实参值;而带参宏展开时,只做简单的字符替换,不计算实参值。第九章 预处理命令(2)函数的调用是在运行时进行的,且为形参分配存储空间;而宏展开是在预编译时进行的,并不为形参分配存储空间。(3)对于函数,要给出参数的类型;而宏则不存在类型问题。例#define N 2+1#define M (N+1)*N/2 main()int j;for(j=1;jM;j+)printf(“%2d”,j);结果:1 2 3 4 5 6 7第九章 预处理命令9.2 文件包含文件包含1.形式:#include#include“文件名”第一种形式用于库函数,第二种多用于用户自定义函数。功能:预编译时,将被包含文件的内容全部复制到包含文件中。第九章 预处理命令/*format.h*/#define PR printf#define NL “n”#define D “%d”#define D1 D NL/*file1.c*/#include “format.h”main()int a=1;PR(D1,a);文件包含处理后:/*file1.c*/#define PR printf#define NL “n”#define D “%d”#define D1 D NLmain()int a=1;PR(D1,a);宏展开:printf(“%d”“n”,a);第九章 预处理命令说明:1.若被包含文件修改了,则包含此文件的所有文件要重新编译。2.文件包含可嵌套P196。3.一个命令只包含一个文件,且要注意包含顺序。若文件1包含文件2,而文件2中要使用文件3的内容,则在文件1中应使用命令:#include“file3.h”#include“file2.h”第九章 预处理命令9.3 条件编译条件编译源程序中的一部分内容只在满足一定条件时才进行编译。n三种形式及功能1.#ifdef 标识符 程序段1#else 程序段2#endif 若宏定义了标识符,则执行程序段1;否则,执行程序段2。第九章 预处理命令2.#ifndef 标识符 程序段1#else 程序段2#endif若没有没有宏定义标识符,则执行程序段1;否则,执行程序段2。3.#if 表达式 程序段1#else 程序段2#endif 若表达式的值为真,则执行程序段1;否则,执行程序段2。