C语言教程:编译预处理 学习目的:预处理命令的作用是改进 程序设计环境,提高编程效率。通 过宏定义、文件包含和条件编译的 讲解,使学生熟悉并能用这三种预 处理命令编写简单程序
C语言教程:编译预处理 学习目的:预处理命令的作用是改进 程序设计环境,提高编程效率。通 过宏定义、文件包含和条件编译的 讲解,使学生熟悉并能用这三种预 处理命令编写简单程序
编译预处理内容介绍 1预处理概述 2宏定义 3文件包含 4条件编译
编译预处理内容介绍 1 预处理概述 2 宏定义 3 文件包含 4 条件编译
预处理命令概述 紫预处理的概念:在对C源程序进行编译之前所 进行的处理 TC中按下Ct+F9所完成的任务:预处理→>编译 →>连接→>运行。 xC中提供的预处理功能:宏定义、文件包含、 条件编译。 紫C中的预处理命令:#开头、无分号结尾、一行 一个、名字可以作为一般标识符,如 int define=3
预处理命令概述 预处理的概念:在对C源程序进行编译之前所 进行的处理。 TC中按下Ctrl+F9所完成的任务:预处理->编译 ->连接->运行。 C中提供的预处理功能:宏定义、文件包含、 条件编译。 C中的预处理命令:#开头、无分号结尾、一行 一个、名字可以作为一般标识符,如: int define=3;
宏定义 兴“宏”的概念:用一个标识符来表示一个 字符串,该标识符称为“宏名” 業对“宏”的处理:在编译预处理时,对 程序中所有出现的“宏名”,都用宏定 义中的字符串去代换,这称为“宏代换” 或“宏展开” “宏”分为有参数和无参数两种 “宏定义”在程序的开头,函数的外部
宏定义 “宏”的概念:用一个标识符来表示一个 字符串,该标识符称为“宏名” 对“宏”的处理:在编译预处理时,对 程序中所有出现的“宏名”,都用宏定 义中的字符串去代换,这称为“宏代换” 或“宏展开” “宏”分为有参数和无参数两种 “宏定义”在程序的开头,函数的外部
无参宏定义的一般形式为:# define标识符字符串 4字符串”可以是常数、表达式、格式串等,如: #define pi3 1415926 井 define nl“n define d“00d3 符号常量的定义就是一种无参宏定义 对程序中反复使用的表达式可以进行宏定义 例如:# define m(y*y+3*y)
无参宏定义的一般形式为:#define 标识符 字符串 “字符串”可以是常数、表达式、格式串等,如: #define PI 3.1415926 #define NL “\n” #define D “%d” 符号常量的定义就是一种无参宏定义 对程序中反复使用的表达式可以进行宏定义 例如: #define M (y*y+3*y)
【例】# define m(y*y+3*y) main i int s,y printf("input a number: 2特别注意:在宏定义 scanf(%od", &y) 中表达式(y*y+3*y)两边的 S=3*M+4*M+5*M 括号不能少。否则会发生 错误。如当作以下定义后: printf("s%dn" S) #difine myy+3y 3在宏展开时将得到下 1s=3*M+4*M+5*M在预处述语句: 理时经宏展开后该语句变为 s3*y*y+3*y+4*y*y+3* s3*(yy+3y)+4*(y*y+3*y)y+5*y*y+3*y; +5*(y*y+3*y)
【例】 #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); } 2.特别注意:在宏定义 中表达式(y*y+3*y)两边的 括号不能少。否则会发生 错误。如当作以下定义后: #difine M y*y+3*y 3.在宏展开时将得到下 述语句: s=3*y*y+3*y+4*y*y+3* y+5*y*y+3*y; 1.s=3*M+4*M+5*M在预处 理时经宏展开后该语句变为: s=3*(y*y+3*y)+4*(y*y+3*y) +5*(y*y+3*y);
对于宏定义说明 1)在宏展开只是一种简单的代换,预处理程序对 它不作任何检查。如有错误,只能在编译已被 宏展开后的源程序时发现。 2)宏定义不是说明或语句,在行末不必加分号, 如加上分号则连分号也一起置换。 3)宏定义必须写在函数之外,其作用域为宏定义 命令起到源程序结束。如要终止其作用域可使 用# undef命令
对于宏定义说明 : 1)在宏展开只是一种简单的代换,预处理程序对 它不作任何检查。如有错误,只能在编译已被 宏展开后的源程序时发现。 2)宏定义不是说明或语句,在行末不必加分号, 如加上分号则连分号也一起置换。 3)宏定义必须写在函数之外,其作用域为宏定义 命令起到源程序结束。如要终止其作用域可使 用# undef命令
例如 #define pi3. 14159 maino #undef pl flo 表示PI只在main函数中有效,在中无效
例如: #define PI 3.14159 main() { …… } #undef PI f1() { …… } 表示PI只在main函数中有效,在f1中无效
4)宏名在源程序中若用引号括起来,则预处 理程序不对其作宏代换。 【例】 #define ok 100 main i printf("OK printf("n";
4) 宏名在源程序中若用引号括起来,则预处 理程序不对其作宏代换。 【例】 #define OK 100 main( ) { printf("OK"); printf("\n"); }
5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定 义的宏名。在宏展开时由预处理程序层层代换。 例如: 井 define pi3.1415926 # define s pi*y*y/P是已定义的宏名* 对语句: printf(%f",S)在宏代换后变为: printf("%of",3.1415926*y*y); 6)习惯上宏名用大写字母表示,以便于与变量区 别。但也允许用小写字母,不要理解为宏名只 能用大写字母表示
5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定 义的宏名。在宏展开时由预处理程序层层代换。 例如: #define PI 3.1415926 #define S PI*y*y /* PI是已定义的宏名*/ 对语句:printf("%f",S);在宏代换后变为: printf("%f",3.1415926*y*y); 6)习惯上宏名用大写字母表示,以便于与变量区 别。但也允许用小写字母,不要理解为宏名只 能用大写字母表示