第11章 编译预处理命令 ★C程序运行一般步骤: 编辑、编译、连接、运行 ★作用:对源程序编译之前做一些处理,生成扩展C 源程序 ★种类 必宏定义 #define 文件包含 #include 必条件编译 #if-#else-#endif等 ★格式: 冬“#”开头 占单独书写行 必行末不加分号
第11章 编译预处理命令 C程序运行一般步骤: ❖编辑、编译、连接、运行 作用:对源程序编译之前做一些处理,生成扩展C 源程序 种类 ❖宏定义 #define ❖文件包含 #include ❖条件编译 #if-#else-#endif等 格式: ❖“#”开头 ❖占单独书写行 ❖行末不加分号
§11.1宏定义 ★不带参数宏定义 般用大写 ”一般形式: #define 宏名 宏体 功能:用指定标识符(宏名)代替字符序列(宏体) 定义位翌:e毅H压数1 作用域:从定义命令到文件结束 必#undef可终止宏到 例 #define YES 格式: #undef main() 冬宏展开 预编译 YES原作用域 令字苻串绿积的奥窬包安系相同也不置换 安病解筛树点eN久 例#defrefineVI心TN+B0 宏定中撰迓 #enineENe州平Wn3TH+40 宏展开:printf(“2Pl= 0GTH*2; var 宏展o宝型92+) printf(%dn”,i);
如 #define PI 3.14; s=r*r*PI; §11.1 宏定义 不带参数宏定义 ❖一般形式: #define 宏名 宏体 ❖功能:用指定标识符(宏名)代替字符序列(宏体) ❖宏展开:预编译时,用宏体替换宏名-不作语法检查 如 #define PI 3.1415926 ❖定义位置:任意(一般在函数外面) ❖作用域:从定义命令到文件结束 ❖#undef可终止宏名作用域 格式: #undef 宏名 例 #define YES 1 main() { . } #undef YES #define YES 0 max() {. } YES原作用域 YES新作用域 ❖宏定义可嵌套,不能递归 ❖字符串常量和注释的内容与宏名相同也不置换 例 #define PI 3.14159 printf(“2*PI=%f\n”,PI*2); 宏展开:printf(“2*PI=%f\n”,3.14159*2); ❖宏定义中使用必要的括号() 例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2; ( ) ( ) #define N 2 #define M N+1 #define NUM 2*M+1 main() {int i ; for(i=1;i<=NUM;i++) printf(“%d\n”,i); } 一般用大写
■带参数宏定义 般形式: #define 宏名(参数表) 字符串 例 #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) 宏展开:Z=(X+y)*(X+y);
◼ 带参数宏定义 ◼ 一般形式: #define 宏名(参数表) 字符串 例 #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);
§11.2 文件包今 直接按标准目录(库函数头文件所在目录)搜索 ★功能: 《”先在当前目录搜索, 再搜索标准目录 包含进来可指定路径,如:#include.wang file22.c” ★一般形式:include <文件名 或include“文件名” ★处理过程:预编译时,用被包含文件的内容取代 该预处理命令,再对“包含”后的文件作一个源 文件编译 #include“file2.c file2.c B A A file2.c filel.c filel.c
§11.2 文件包含 功能:一个源文件可将另一个源文件的内容全部 包含进来 一般形式: #include <文件名> 或 #include “文件名” #include “file2.c” file1.c file2.c file1.c file2.c A B A 处理过程:预编译时,用被包含文件的内容取代 该预处理命令,再对“包含”后的文件作一个源 文件编译 <> 直接按标准目录(库函数头文件所在目录)搜索 “” 先在当前目录搜索,再搜索标准目录 可指定路径,如:#include “c:\wang\file2.c