第九章预她理命令 →9.1宏定义 →9.2文件包含处理 →9.3条件编译
第九章 预处理命令 9.1 宏定义 9.2 文件包含处理 9.3 条件编译
9.1宏定义 宏定义 用预处理命令# define命令指定的预处理。包括 不带参数和带参数宏定义两种。 不带参数宏定义 用一个指定的标识符代表一个字符串 # define标识符字符串 标识符称为宏名,字符串称为宏体。 在预处理时将该宏名用宏体替换,成为宏展开
9.1 宏定义 宏定义 用预处理命令#define命令指定的预处理。包括 不带参数和带参数宏定义两种。 不带参数宏定义 用一个指定的标识符代表一个字符串. #define 标识符 字符串 标识符称为宏名,字符串称为宏体。 在预处理时将该宏名用宏体替换,成为宏展开
9.1宏定义 说明 为与变量名区别,宏名一般习惯用大写字母表示 使用宏定义可以提高程序的通用性和可读性,易 于修改 预处理时不进行语法检查 #define pi 3.4159 宏定义不是c语句,不必加“;”,若有,则将 起处理 #define pi 3.14159 area=PI*r*r;/米area=3.14159;*米r;
9.1 宏定义 说明 为与变量名区别,宏名一般习惯用大写字母表示. 使用宏定义可以提高程序的通用性和可读性,易 于修改. 预处理时不进行语法检查. #define PI 3.l4l59 宏定义不是c语句,不必加“ ;”,若有,则将一 起处理。 #define PI 3.14159; area=PI*r*r; /* area=3.14159;*r*r;*/
9.1宏定义 宏定义的有效范围为宏定义处# define g98 到文件结束。可以用# undef命令main0 终止宏定义的作用域。 #undef g f10 宏定义时可以引用已经定义的宏名。 程序中用“”括起来的字符串不进行置换 宏定乂只作字符替换,不分配内存空间
9.1 宏定义 宏定义的有效范围为宏定义处 到文件结束。可以用#undef命令 终止宏定义的作用域。 宏定义时可以引用已经定义的宏名。 程序中用“”括起来的字符串不进行置换。 宏定义只作字符替换,不分配内存空间。 #define G 9.8 main() { ……} #undef G f1() {……}
9,1宏定义 带参数宏定义 带参宏定义的格式 # define宏名(参数表)宏体 #define s(a, b) atb area=S(2, 3) /米area=2*3;米 带参宏替换在形式上类似函数,也带有形参,调 用时也进行实参和形参的结合
9.1 宏定义 带参数宏定义 带参宏定义的格式: #define 宏名(参数表) 宏体 #define S(a,b) a*b area=S(2,3); /* area=2*3;*/ 带参宏替换在形式上类似函数,也带有形参,调 用时也进行实参和形参的结合
9,1宏定义 说明 对带参宏定义,宏体及其各个形参应该用圆括 号括起来。如: #define pi 3.1415926 #define s (r) Pi*r*r area=S(atb)/* area=PI*a+b*a+b */ m=1/S(a+b)/*m=1/PI*a+b*a+b*/ #define s(r Pi*(r)*(r) area=s(atb)/ area=PI*(a+b)*(a+b)*/ m=/S(a+b)/米m=1/PI*(a+b)*(a+b)*/ #define s(r(Pi*(r)*(r)) area=S(a+b)/*area=PⅠ*(a+b)米(a+b)米/ m=1/S(a+b)/*m=1/(PI米(a+b)*(a+b)米/
9.1 宏定义 说明 对带参宏定义,宏体及其各个形参应该用圆括 号括起来。 如: #define PI 3.1415926 #define S(r) PI*r*r area=S(a+b) /* area=PI*a+b*a+b */ m=1/S(a+b) /* m=1/PI*a+b*a+b */ #define S(r) PI*(r)*(r) area=S(a+b) /* area=PI*(a+b)*(a+b) */ m=1/S(a+b) /* m=1/PI*(a+b)*(a+b) */ #define S(r) (PI*(r)*(r) ) area=S(a+b) /* area=PI*(a+b)*(a+b) */ m=1/S(a+b) /* m=1/(PI*(a+b)*(a+b)) */
9,1宏定义 宏名与宏体之间以空格相隔,宏名中不能有空 格。例 #define s(r(pi(r)(r) area=S(a)/米area=(r)(PI*(r)米(r))(a)米/ 宏名不能用引号括起来 如:# define“YES”1将不进行宏替换。 同样宏替换中的宏名也不可用引号括起来,如 #define yes 1 printf (yes) 也不能进行宏替换
9.1 宏定义 宏名与宏体之间以空格相隔,宏名中不能有空 格。例: #define S (r) (PI*(r)*(r)) area=S (a) /* area=(r) (PI*(r)*(r))(a) */ 宏名不能用引号括起来。 如:#define “YES” 1将不进行宏替换。 同样宏替换中的宏名也不可用引号括起来,如: #define YES 1 printf(“YES”); 也不能进行宏替换
92文件包含 文件包含是指一个源文件可以将另一个源文件的 的整个内容包含进来 文件包含的格式: # include 系统只到存放C库函数头文件所在的目录中 寻找要包含的文件,成为标准方式。 # include“文件名” 系统首先在用户当前目录中检索,若没找到, 则按标准方式检索
9.2 文件包含 文件包含是指一个源文件可以将另一个源文件的 的整个内容包含进来。 文件包含的格式: #include 系统只到存放C库函数头文件所在的目录中 寻找要包含的文件,成为标准方式。 #include “文件名” 系统首先在用户当前目录中检索,若没找到, 则按标准方式检索
92文件包含 例文件包含举例 powers. h * #define sqr(x)((x)*(x)) #define cube(x)((x)(x)*(x)) #define quad(x)((x)*(x)*(x)*(X) /*ch810,c* #include #included: zhoulpowers h #define maX power 10 void maino int n printf("number It exp2 \t exp t exp4n printf("----t----lt-----t------In") for(n=1; <=MAX POWER; n++) printf( %02dt %3dt%/4d\t %/5d\n", 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:\zhou\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)); } 9.2 文件包含