第十一章预处理
第十一章 预处理
111宏定义 无参宏定义 ■所谓预处理是指在进行编译的第一遍扫描 (词法扫描和语法分析)之前所做的工作 ■预处理是C语言的一个重要功能,它由预 处理程序负责完成。当对一个源文件进行 编译时,系统将自动引用预处理程序对源 程序中的预处理部分作处理,处理完毕自 动进入对源程序的编译。 C语言提供了多种预处理功能,如宏定义 文件包含、条件编译等。 第六章基本数据类型
第六章 基本数据类型 ◼ 所谓预处理是指在进行编译的第一遍扫描 (词法扫描和语法分析)之前所做的工作。 ◼ 预处理是C语言的一个重要功能,它由预 处理程序负责完成。当对一个源文件进行 编译时,系统将自动引用预处理程序对源 程序中的预处理部分作处理,处理完毕自 动进入对源程序的编译。 ◼ C语言提供了多种预处理功能,如宏定义、 文件包含、条件编译等。 11.1 宏定义 一、无参宏定义
111宏定义 、无参宏定义 ■在C语言源程序中允许用一个标识符来表示 个字符串,称为“宏”。被定义为“宏”的标 识符称为“宏名”。 ■在编译预处理时,对程序中所有出现的“宏 名”,都用宏定义中的字符串去代换,这称为 “宏代换”或“宏展开” ■宏定义是由源程序中的宏定义命令完成的。宏 代换是由预处理程序自动完成的。 第六章基本数据类型
第六章 基本数据类型 ◼ 在C语言源程序中允许用一个标识符来表示一 个字符串,称为“宏”。被定义为“宏”的标 识符称为“宏名” 。 ◼ 在编译预处理时,对程序中所有出现的“宏 名”,都用宏定义中的字符串去代换,这称为 “宏代换”或“宏展开” 。 ◼ 宏定义是由源程序中的宏定义命令完成的。宏 代换是由预处理程序自动完成的。 11.1 宏定义 一、无参宏定义
111宏定义 无参宏定义 定义形式:# define标识符字符串 其中的“#”表示这是一条预处理命令。凡是以 “#”开头的均为预处理命令。 “ define”为宏定义命令。 “标识符”为所定义的宏名。“字符串”可以 是常数、表达式、格式串等 如:# define m(yy+3y) 定义M表达式(y*y+3y) 第六章基本数据类型
第六章 基本数据类型 11.1 宏定义 一、无参宏定义 ◼ 定义形式:#define 标识符 字符串 ◼ 其中的“#”表示这是一条预处理命令。凡是以 “#”开头的均为预处理命令。 ◼ “define”为宏定义命令。 ◼ “标识符”为所定义的宏名。“字符串”可以 是常数、表达式、格式串等。 如:#define M (y*y+3*y) 定义M表达式(y*y+3*y)
111宏定义 无参宏定义 「例11 #define M(y*y+3*y) maint i int s, y printf( input a number: ) scanf(%d", &y); s=3*M+4*M+5*M; printf(s=%d\n",S); 第六章基本数据类型
第六章 基本数据类型 [例11.1] #define M (y*y+3*y) main( ) { int s,y; printf("input a number:"); scanf("%d",&y); s=3*M+4*M+5*M; printf("s=%d\n",s); } 11.1 宏定义 一、无参宏定义
111宏定义 无参宏定义 ■在预处理时经宏展开后该语句变为: s=3(yy+3xy)+4*(yy+3*y)+5*(y*y十3y); 在宏定义中表达式(y*y+3y两边的括号 不能少,否则会发生错误。 第六章基本数据类型
第六章 基本数据类型 ◼ 在预处理时经宏展开后该语句变为: s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y); ◼ 在宏定义中表达式(y*y+3*y)两边的括号 不能少,否则会发生错误。 11.1 宏定义 一、无参宏定义
111宏定义 、无参宏定义 □说明: 1)宏定义是用宏名来表示一个字符串,在宏展开时 又以该字符串取代宏名,这只是一种简单的代换 字符串中可以含任何字符,可以是常数,也可以 是表达式,预处理程序对它不作任何检查。如有 错误,只能在编译已被宏展开后的源程序时发现。 )宏定义不是说明或语句,在行末不必加分号,如 加上分号则连分号也一起置换。 3宏定义必须写在函数之外,其作用域为从宏定义 命令起到源程序结束。如要终止其作用域可使用 # undef命令。 第六章基本数据类型
第六章 基本数据类型 说明: 1)宏定义是用宏名来表示一个字符串,在宏展开时 又以该字符串取代宏名,这只是一种简单的代换, 字符串中可以含任何字符,可以是常数,也可以 是表达式,预处理程序对它不作任何检查。如有 错误,只能在编译已被宏展开后的源程序时发现。 2)宏定义不是说明或语句,在行末不必加分号,如 加上分号则连分号也一起置换。 3)宏定义必须写在函数之外,其作用域为从宏定义 命令起到源程序结束。如要终止其作用域可使用 #undef命令。 11.1 宏定义 一、无参宏定义
111宏定义 无参宏定义 )宏名在源程序中若用引号括起来,则预处理程序 不对其作宏代换。 「例12 #define oK 100 maino printf( OK) printf("n"); 程序的运行结果为:OK 第六章基本数据类型
第六章 基本数据类型 [例11.2] #define OK 100 main( ) { printf("OK"); printf("\n"); } 程序的运行结果为:OK 4)宏名在源程序中若用引号括起来,则预处理程序 不对其作宏代换。 11.1 宏定义 一、无参宏定义
111宏定义 无参宏定义 5)宏定义允许嵌套,在宏定义的字符串中可以使 用已经定义的宏名。在宏展开时由预处理程序 层层代换。 tA: #define PI 3. 1415926 #define s pi* y*y 对语句: printf("%r",s);在宏代换后变为: printf(%of',3.1415926y*y); 6)习惯上宏名用大写字母表示,以便于与变量区 别。但也允许用小写字母。 7)对“输出格式”作宏定义,可以减少书写麻烦 第六章基本数据类型
第六章 基本数据类型 5)宏定义允许嵌套,在宏定义的字符串中可以使 用已经定义的宏名。在宏展开时由预处理程序 层层代换。 如:#define PI 3.1415926 #define S PI *y*y 对语句:printf("%f",s); 在宏代换后变为: printf("%f",3.1415926*y*y); 6)习惯上宏名用大写字母表示,以便于与变量区 别。但也允许用小写字母。 7)对“输出格式”作宏定义,可以减少书写麻烦。 11.1 宏定义 一、无参宏定义
111宏定义 无参宏定义 「例131 #define p printf define d"%dⅦn #define f i%ofn'l main i int a=5, c=8,e=11; float b=38,d=9.7,f21.08; PDF,a, b) PF, c, d) P(DF,e,動; 第六章基本数据类型
第六章 基本数据类型 [例11.3] #define P printf #define D "%d\n" #define F "%f\n" main( ) { int a=5,c=8,e=11; float b=3.8,d=9.7,f=21.08; P(DF,a,b); P(DF,c,d); P(DF,e,f); } 11.1 宏定义 一、无参宏定义