第9章预处理命令(1学时) C提供的预处理功能主要有三种 1.宏定义 2.文件包含 3.条件编译 预处理命令都以符号“#”开头 如:# define Include fif sftelse-itendif
第9章 预处理命令(1学时) • C提供的预处理功能主要有三种: 1. 宏定义 2. 文件包含 3. 条件编译 • 预处理命令都以符号“#”开头 • 如:#define • #include • #if ~#else~#endif
宏定义 不带参数的宏定义 格式:# define标识符。字符串 如 #define 3.1415926 作用:用标识符P代替“3.1415926” 符串 以一个简单的名字代替一个长字符串 在预编译时进行宏展开
宏定义 • 不带参数的宏定义 • 格式: #define 标识符 字符串 • 如: #define PI 3.1415926 • 作用:用标识符PI代替“3.1415926” 字 符串 • 以一个简单的名字代替一个长字符串 在预编译时进行宏展开
可以用# undef命令终止宏定义的作用域 进行宏定义时,可以引用已定义的宏名,可以 层置换 例92 1. #defineR 3.0 2.# define F3.1415926 3. #define L 2*P*R 4. #define S P*R*R 5. main( 6.{ 7. printf("L=%f\nS=%fn" L, S); 8.} 9.结果:L=18849556 10 S=28.274333
• 可以用#undef命令终止宏定义的作用域 • 在进行宏定义时,可以引用已定义的宏名,可以 层层置换 • 例9.2 1. #define R 3.0 2. #define PI 3.1415926 3. #define L 2*PI*R 4. #define S PI*R*R 5. main( ) 6. { 7. printf("L=%f\nS=%f\n",L,S); 8. } 9. 结果:L=18.849556 10. S=28.274333
·L展开后为:2*3.141592*30 ·S展开后为:3.141592*3.0*30 对程序中用双引号扩起来的字符串内的字 符不进行置换 宏定义与变量的定义不同,只作字符替换, 不分配内存空间
• L展开后为:2*3.141592*3.0 • S展开后为:3.141592*3.0*3.0 • 对程序中用双引号扩起来的字符串内的字 符不进行置换 • 宏定义与变量的定义不同,只作字符替换, 不分配内存空间
带参的宏定义 格式:# define宏名(参数表)字符串 如:# define s(a,b)a"b area=S(3, 2) 展开后:area=3*2 例93 1.# define f3.1415926 2. #define s(r) PIrr 3. main() 4. float a, area 5.a=3.6 6. area=S(a) printf(r=%f\narea=%fn", area); 1
带参的宏定义 • 格式:#define 宏名(参数表) 字符串 • 如:#define S(a,b) a*b • area=S(3,2); • 展开后:area=3*2; • 例9.3 1. #define PI 3.1415926 2. #define S(r) PI*r*r 3. main( ) 4. {float a,area; 5. a=3.6; 6. area=S(a); 7. printf("r=%f\narea=%f\n",area);}
运行结果:「=3600000 area=40.715038 赋值语句area=S(a);经宏展开后为: area=3.1415926a*a 讨论: 带参的宏改为:area=S(a+b) 经宏展开后的表达式为 areas*a+b* a+b 等同于:area=(P|*a)+(b*a)+b 正确用法:# define s(r)P()()
• 运行结果:r=3.600000 • area=40.715038 • 赋值语句area=S(a);经宏展开后为: • area=3.1415926*a*a; • 讨论: • 带参的宏改为:area=S(a+b); • 经宏展开后的表达式为: • area=PI*a+b*a+b; • 等同于:area=(PI*a)+(b*a)+b; • 正确用法: #define S(r) PI*(r)*(r)
“文件包含”处理 一个源文件可以将另一个源文件的全部内 容包含进来称“文件包含” 格式:# nclude“文件名” 或# include file lc file1.c file2. c include<file2 CKr B B A A 文件包含的使用可以节省设计人员的重复 劳动。如,符号常量的加载
“文件包含”处理 • 一个源文件可以将另一个源文件的全部内 容包含进来称“文件包含” • 格式:#include “文件名” • 或 #include • 文件包含的使用可以节省设计人员的重复 劳动。如,符号常量的加载 file1.c file2.c include A B file1.c A B
条件编译 当条件满足时对一组语句进行编译,香则 对另一组语句进行编译 格式: #fdef标识符 程序段1 ifelse 程序段2] fendi
条件编译 • 当条件满足时对一组语句进行编译,否则 对另一组语句进行编译 (1) • 格式: #ifdef 标识符 程序段1 [#else 程序段2] #endif
(2) 格式: # indef标识符 程序段1 felse 程序段2] iendif
(2) • 格式: #ifndef 标识符 程序段1 [#else 程序段2] #endif
(3) 格式: f表达式 程序段1 ielse 程序段2 iendif
(3) • 格式: #if 表达式 程序段1 #else 程序段2 #endif