第12章编译预处理 12.1了编译预理 12.2宏定火 12.3文件包含 12.4条件编译 点专此处结束放殃 4合
第12章 编译预处理 12.1 了解编译预处理 12.2 宏 定 义 12.3 文 件 包 含 12.4 条 件 编 译
12.1了解编译预处理 C语言所提供的“编译预处理”功能 是它区别于其他高级语言的又一重要特征, 其主要功能包括三种:宏定义、文件包含 和条件编译,分别由三种命令来实现。为 了区别于C语句,预处理命令必须出现在 行的开始并以“#”号打头。 点专此处结束放殃 4合
12.1 了解编译预处理 C语言所提供的“编译预处理”功能 是它区别于其他高级语言的又一重要特征, 其主要功能包括三种:宏定义、文件包含 和条件编译,分别由三种命令来实现。为 了区别于C语句,预处理命令必须出现在 一行的开始并以“#”号打头
122宏定义 宏定义由# define命令实现,根据实际 应用的需要可以分为不带参数的宏定义和 带有参数的宏定义两种命令形式。 12.2.1不带参数的宏定义 命令的一般形式为: # define标识符字符串 点专此处结束放殃 4合
12.2 宏 定 义 宏定义由#define命令实现,根据实际 应用的需要可以分为不带参数的宏定义和 带有参数的宏定义两种命令形式。 12.2.1 不带参数的宏定义 命令的一般形式为: #define 标识符 字符串
定义中的“标识符”称为“宏名”。 这一命令的作用仅仅是表明用指定的宏名 来代替一个指定的字符串。例如 #define pi 3.1415926 它的作用是指定用宏名PI来代替 “3.1415926”这个字符串。在预编译时 程序中所有出现“宏名”的地方,都将由 这个字符串的内容进行替换,此过程称为 “宏展开”。 点专此处结束放殃 4合
定义中的“标识符”称为“宏名” 。 这一命令的作用仅仅是表明用指定的宏名 来代替一个指定的字符串。例如: #define PI 3 .1415926 它 的 作 用 是 指 定 用 宏 名 PI 来代替 “3 .1415926”这个字符串。在预编译时, 程序中所有出现“宏名”的地方,都将由 这个字符串的内容进行替换,此过程称为 “宏展开”
说明 (1)不带参数的宏定义常常被用于定 义符号常量。这样既可以提高程序的通用 性,也便于修改。 例121用宏名限定数组的大小。 #define n 1o /定义宏名N* void arrIn(int ad i int i; 点专此处结束放殃 4合
说明 (1)不带参数的宏定义常常被用于定 义符号常量。这样既可以提高程序的通用 性,也便于修改。 例12.1 用宏名限定数组的大小。 #define N 10 /* 定义宏名N */ void ArrIn(int a[]) { int i;
for(i=0; K<N; i++) /为N个元素赋值 scanf(%d", &aiD; main f int xN; /定义有N个元素的数组 Arren(x); @ 点专此处结束放殃 4合
for(i=0; i<N; i++) /* 为N个元素赋值*/ scanf("%d",&a[i]); } main( ) { int x[N]; /* 定义有N个元素的数组 */ ArrIn(x); … }
以上是我们在编程中常用的方法:首 先利用宏定义指定用N代表字符串10;所 以主函数中定义的数组大小是10;函数 ArrIn中读入的元素个数也是10。当需要改 变数组大小时,只需改动# define命令行, 而不用改动程序的其他部分。 (2)宏展开时系统不作语法检查,若 定义不当,要待编译展开源程序时,才会 引发错误 点专此处结束放殃 4合
以上是我们在编程中常用的方法:首 先利用宏定义指定用N代表字符串10;所 以主函数中定义的数组大小是10;函数 ArrIn中读入的元素个数也是10。当需要改 变数组大小时,只需改动#define命令行, 而不用改动程序的其他部分。 (2)宏展开时系统不作语法检查,若 定义不当,要待编译展开源程序时,才会 引发错误
例如: define pi 3. 141592b maino i float s, r=2.5 s=PL r.r: printf(s=%fn"s); 点专此处结束放殃 4合
例如: #define PI 3.141592b main( ) { float s, r=2.5; s=PI* r* r; printf("s=%f\n",s); }
程序中在定义代表π值的宏名PI时 将字符串31415926中的数字6误写作了字 母b。这一宏定义命令本身并不构成错误。 因为宏名P代表的是字符串“3.141592b”, 而不是数值。但在程序中引用了宏名PI来 计算圆面积,赋值语句: s=Plr ra 点专此处结束放殃 4合
程序中在定义代表值的宏名PI时, 将字符串3.1415926中的数字6误写作了字 母b。这一宏定义命令本身并不构成错误。 因为宏名PI代表的是字符串“3.141592b”, 而不是数值。但在程序中引用了宏名PI来 计算圆面积,赋值语句: s=PI* r* r;
经宏展开后变为: S=3141592brr; 从而导致编译出错。虽然出错位置在 此赋值语句,但引发这一错误的根源还是 上述宏定义命令。 点专此处结束放殃 4合
经宏展开后变为: s=3.141592b* r* r; 从而导致编译出错。虽然出错位置在 此赋值语句,但引发这一错误的根源还是 上述宏定义命令