第九章 编谇预处理 重庆工学院 9 计算机科学与工程学院 基础条
重庆工学院 计算机科学与工程学院 9 基础系 第九章 编译预处理
第九章编译预处理 °编译预处理 ◆宏定义◆文件包含◆条件编译 【编译】C编译系统对源程序进行:词法和语法 分析,代码生成,优化→.OB丿文件 【编译预处理〗编译前对源程序进行一些预加工 改善程序设计环境/模块化设计) °编译预处理命令均以#开头,未尾不加分号 °可出现在程序的任何位置,其作用范围:出现 点至所在源程序未尾。 2重庆工学院计算机科学与工程学院基础系20212月20日星期六
第九章 编译预处理 2 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 ◆宏定义 ◆文件包含 ◆条件编译 【编译】C编译系统对源程序进行:词法和语法 分析,代码生成,优化 → .OBJ文件 【编译预处理】编译前对源程序进行一些预加工 (改善程序设计环境/模块化设计) • 编译预处理命令均以#开头,未尾不加分号 • 可出现在程序的任何位置,其作用范围:出现 点至所在源程序未尾。 • 编译预处理
第九章编译预处理 预处理功能 C语言的预处理程序负责分析和处理以“#为首字符 的预处理控制行。预处理是在编译前进行的。 预处理控制行主要有 宏替换、文件包含、条件编译和行控制等。 宏替换 define预处理命令不仅可以定义符号常量及字符串, 而且也可以定义带参数的宏。 简单的字符串替换 般形式 # define宏标识符字符串 通常“宏标识符”用大写字母表示,用空格分开,末尾不 带“;”,以换行符结束。 3重庆工学院计算机科学与工程学院基础系021月20日星期六 ≤D<面
第九章 编译预处理 3 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 预处理功能 C语言的预处理程序负责分析和处理以“#”为首字符 的预处理控制行。预处理是在编译前进行的。 预处理控制行主要有: 宏替换、文件包含、条件编译和行控制等。 宏替换 define预处理命令不仅可以定义符号常量及字符串, 而且也可以定义带参数的宏。 1. 简单的字符串替换 一般形式 #define 宏标识符 字符串 通常“宏标识符”用大写字母表示,用空格分开,末尾不 带“ ;” , 以换行符结束
第九章编译预处理 例如: #definen 10 #define true -1 #define false o #define on 1 #define off o #define yes 1 #define no o #define pi 3.14159 #define e 2.7183 #define black o #define blue 1 #define begin i #define end j 重庆工学院计算机科学与工程学院基础系 2021年2月20日星期六
第九章 编译预处理 4 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 例如: #define N 10 #define TRUE -1 #define FALSE 0 #define ON 1 #define OFF 0 #define YES 1 #define NO 0 #define PI 3.14159 #define E 2.7183 #define BLACK 0 #define BLUE 1 #define BEGIN { #define END }
第九章编译预处理 使用宏替换可增加程序的可移植型 例如:在程序中定义显示工作摸式为640*350, # defineⅩMAX639 #define YMAM 349 当改为1024*1024时,可定义如下: #define XMAX 1023 #define YMAX 1023 这就增加了图形程序对硬件环境的适应性 带参宏定义及宏调用 与函数可带形式参数一样,宏标识符也可带有参数。 在程序中可用实参数替带形式参数,实现宏调用。 重庆工学院计算机科学与工程学院基础系 2021年2月20日星期六
第九章 编译预处理 5 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 使用宏替换可增加程序的可移植型。 例如:在程序中定义显示工作摸式为640*350, #define XMAX 639 #define YMAM 349 当改为1024*1024时,可定义如下: #define XMAX 1023 #define YMAX 1023 这就增加了图形程序对硬件环境的适应性。 2. 带参宏定义及宏调用 与函数可带形式参数一样,宏标识符也可带有参数。 在程序中可用实参数替带形式参数,实现宏调用
第九章编译预处理 宏定义的一般格式: # define宏标识符(形参数表)表达式 宏调用的一般形式 宏标识符(实参数表) 例如 #define MAX(a, b) (a>b)?a: b main() int x, y; X=10;y=20; pr intf(" 'The max imum data is: %d?", MAX(x, y)) 替换过程: pr intf ("The max imum data is %d",(x>y)?x: y) 重庆工学院计算机科学与工程学院基础系 2021年2月20日星期六
第九章 编译预处理 6 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 宏定义的一般格式: #define 宏标识符(形参数表) 表达式 宏调用的一般形式: 宏标识符(实参数表) 例如: #define MAX(a,b) (a>b)?a:b main( ) { int x,y; x=10;y=20; printf(”The maximum data is :%d”,MAX(x,y)); } 替换过程: printf(”The maximum data is :%d”,(x>y)?x:y);
第九章编译预处理 1、宏定义 格式# define宏名宏体 宏名和宏体均为字符串,前者必须符合标识符 命名规则。预处理时在程序中用宏体替换宏名。 注意:可以用 # undef宏名 终止该宏名的作用范围。 宏定义的撤消 # undef宏标识符 7重庆工学院计算机科学与工程学院基础系202年2月20日星期六
第九章 编译预处理 7 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 1、宏定义 格式 #define 宏名 宏体 宏名和宏体均为字符串,前者必须符合标识符 命名规则。预处理时在程序中用宏体替换宏名。 注意:可以用 #undef 宏名 终止该宏名的作用范围。 宏定义的撤消: #undef 宏标识符
第九章编译预处理 ①定义符号常量 【例 *defineM3 结果:NN=8,5NN=40 #define N(M+ define nnn*n/2 【讨论】 main( 如果第二行改为 define N M+1 corsarO printf("NN= %d, "NN) 结果:NN=6,5NN=18 printf(5"NN=%d\n, 5*NN) 8重庆工学院计算机科学与工程学院基础系2021年2月20日星期六
第九章 编译预处理 8 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 ①定义符号常量 【例一】 #define M 3 #define N (M+1) #define NN N*N/2 main() { clrscr(); printf("NN=%d,",NN); printf("5*NN=%d\n",5*NN); } 结果:NN=8,5*NN=40 【讨论】 如果第二行改为: #define N M+1 结果: NN=6,5*NN=18
第九章编峄预处理 ②带参数的宏定义 格式# define宏名(参数表)宏体 【例二】 define pl 3.14159 #define s()PI*r 结果: maino r=1,S=3.141590 float a=1. sum sum=s(a) printf("r=%of, s=%f\", a, sum) 9重庆工学院计算机科学与工程学院基础系021年2月20日星期六
第九章 编译预处理 9 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 ②带参数的宏定义 格式 #define 宏名(参数表) 宏体 【例二】 #define PI 3.14159 #define s(r) PI*r*r main() { float a=1,sum; sum=s(a); printf("r=%.0f,s=%f\n",a,sum); } 结果: r=1,s=3.141590
第九章编译预处理 ②带参数的宏定义 结果:9.5 【例三】 define pt5.5 s(a+b)=5.5×1+2×1+2=9.5 #define S(A) PT*AA 【讨论】注意s(a+b) maino 不是函数,它不做任 何计算(如果是函数, int a=1.b=2 则s(a+b)为s(3),结果 49.5 printf(9%4.fin"s(a+b) 10重庆工学院计算机科学与工程学院基础系2021年2月20日星期六
第九章 编译预处理 10 重庆工学院计算机科学与工程学院 基础系 2021年2月20日星期六 ②带参数的宏定义 【例三】 #define PT 5.5 #define s(A) PT*A*A main() { int a=1,b=2; printf("%4.1f\n",s(a+b)); } 结果:9.5 【讨论】注意s(a+b) 不是函数,它不做任 何计算(如果是函数, 则s(a+b)为s(3),结果 49.5) s(a+b)=5.5×1+2×1+2=9.5