第九章预处理命令 ●在编译前进行预处理的特殊命令(不 是C语句) ●三种预处理功能 √宏定义 √文件包含 √条件编译
第九章 预处理命令 ⚫在编译前进行预处理的特殊命令(不 是C语句) ⚫三种预处理功能 ✓宏定义 ✓文件包含 ✓条件编译
宏定义--不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符 串(如定义符号常量)。其一般形式为: # define标识答字符串 define price 2.5 define pl 3.1415926 宏定义命令# define g98 define true 1 #define false o #define Prn printf( 大大大大大大大大大大大大大大大大大
用一个指定的标识符(即名字)来代表一个字符 串(如定义符号常量)。其一般形式为: #define 标识符 字符串 宏定义命令 宏名 宏体 #define PRICE 2.5 #define PI 3.1415926 #define G 9.8 #define TRUE 1 #define FALSE 0 #define PRN printf("*****************") 宏定义----不带参数的宏定义
例输入一个球的半径,试求球的周长、表面积 和体积。 #include #define pi 3. 1415926 main( f float r, l, s, v; printf("Please intput the radius of a shere scan nf("%of", &r) 1=2.0*PI*r; s=2.0*PI**r 40/3.0*PI**r*r printf("1=%10. 4fns-=%10.4fnv=%104f, l, S,v)
例 输入一个球的半径,试求球的周长、表面积 和体积。 #include #define PI 3.1415926 main() { float r,l,s,v; printf("Please intput the radius of a shere:"); scanf("%f",&r); l=2.0*PI*r; s=2.0*PI*r*r; v=4.0/3.0*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f",l,s,v); }
说明 1.宏名一般习惯用大写字母表示,以便于 与变量名、关键字区分。 2.宏定义是用宏名代替一个字符串,只是 简单的置换,不作正确性检查。 3.宏定义不是C语句,不必在行末加分号。 4.宏定义的有效范围是:宏定义命令之后 直到此源文件结束。可以使用#ndef终 止其作用域
说明: 1. 宏名一般习惯用大写字母表示,以便于 与变量名、关键字区分。 2. 宏定义是用宏名代替一个字符串,只是 简单的置换,不作正确性检查。 3. 宏定义不是 C 语句,不必在行末加分号。 4. 宏定义的有效范围是:宏定义命令之后 直到此源文件结束。可以使用#undef 终 止其作用域
说明:(续) 5.在进行宏定义时,可以引用已定义的宏名, 进行层层置换 6.对程序中用双撇号括起来的字符串中的字 符,即使与宏名相同,也不进行置换 7.宏定义只作字符置换,不分配内存空间
说明: (续) 5. 在进行宏定义时,可以引用已定义的宏名, 进行层层置换。 6. 对程序中用双撇号括起来的字符串中的字 符,即使与宏名相同,也不进行置换。 7. 宏定义只作字符置换,不分配内存空间
宏定义--带参数的宏定义 其定义的一般形式为: define宏名(参数表)宏体 其中:宏名与后面的形参表左边的括号之间不能有 空格;# define、宏名(形参表)、宏体之间以空格相 间隔,宏体可以是由表达式或语句组成的字符序列 通常,参数和宏体都使用圆括号括起来 define pl 3.1416 #define s(o pl*(o*(o tdefine MAX(a, b)(a)>(b)?(a): (b)
宏定义----带参数的宏定义 其定义的一般形式为: #define 宏名(参数表) 宏体 其中:宏名与后面的形参表左边的括号之间不能有 空格; #define、宏名(形参表)、宏体之间以空格相 间隔,宏体可以是由表达式或语句组成的字符序列 通常,参数和宏体都使用圆括号括起来。 #define PI 3.1416 #define S(r) PI*(r)*(r) #define MAX(a,b) (a)>(b)?(a):(b)
例求三个数中的最大值。其中,求两个数中的 较大数用宏定义实现。 #include #define MaX(x,y)(x)>(y)? (x): (y) maino f float a, b, c, t; printf("please intput 3 real number a, b, c: scanf("%f, %f, %f", &a, &b, &c) tMAX(a, b) printf(" The max number is %/0.2f MAX(t, c))
例 求三个数中的最大值。其中,求两个数中的 较大数用宏定义实现。 #include #define MAX(x,y) (x)>(y)?(x):(y) main() { float a,b,c,t; printf("Please intput 3 real number a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); t=MAX(a,b); printf("The max number is %0.2f",MAX(t,c)); }
文件包含 ●一个源文件可以将另一个源文件的全部 内容包含进来,称为文件包含 ●命令形式: include“文件名”或 # include-标准方式
文件包含 ⚫ 一个源文件可以将另一个源文件的全部 内容包含进来,称为文件包含 ⚫ 命令形式: #include “文件名” 或 #include --标准方式
例 #include prIn float real sqrt(float x) :) sca i float x1=1.0, x2 a x2=0.5*(x1+x/x1) X while(fabs(x2-XI>lE-5) prI {X1=x2 x, real sart(y)) egx2=0.5*(x1+xx1) prI real sqrt(y)) return(X2)
例:求任意一个实数的平方根。 #include #include "c:\tc\user\f9-5-1.c" #include "c:\tc\user\f9-5-2.c" main() { float x,y; printf("Please input a real number: "); scanf("%f",&x); y=absolute(x); if(x=0) return (x); else return (-x); } /* File-Name: F9-5-2.C */ #include float real_sqrt(float x) { float x1=1.0,x2; x2=0.5*(x1+x/x1); while(fabs(x2-x1)>1E-5) { x1=x2; x2=0.5*(x1+x/x1); } return (x2); }
条件编译 条件编译即根据不同的编译条件来编译源 程序中的某些程序段,从而使同一源程序可 产生不同的目标代码。 使用条件编译有利于程序的调试,便于程 序移植,可提高软件的通用性
条件编译 条件编译即根据不同的编译条件来编译源 程序中的某些程序段,从而使同一源程序可 产生不同的目标代码。 使用条件编译有利于程序的调试,便于程 序移植,可提高软件的通用性