#define命令
一、相关知识学习
#define命令用于宏定义,按类型可以分为不带参数的宏定义和带参数的宏定义。
(1)不带参数的宏定义
不带参数的宏定义通常用于定义程序中所使用的符号常量。
定义格式:#define 符号常量名称 替换文本
符号常量名称也称为宏名(习惯上用大写字母表示);替换文本可以是C语言允许的标识符、关键字、数值、字符、字符串、运算符以及各种标点符号。每条宏定义命令要单独占一行,不能在结尾加“;”。 例如:
#define PI 3.14160
在预编译时,将程序中所有的符号常量名都使用替换文本替换,该过程称为“宏展开”。 例:计算圆的面积(利用#define命令定义π值)。
源程序代码:
#define PI 3.1415926
#include <stdio.h>
main()
{ float r , area ;
r = 2.0 ;
area = PI * r * r ;
printf( “PI=%f, Area= %f \n”, PI , area) ;
}
经过宏展开后,printf函数中的输出项area被展开为3.1415926*2.0*2.0。
如果程序中使用双引号“ ”引起来的字符串中有与符号常量名相同的字符串,不能进行替换。例如上题中“PI=%f, Area= %f \n”括起的PI是普通字符而不是符号常量。 此外,宏定义只是字符替代,不分配存储空间,不进行语法检查。
使用宏定义可以减少程序中重复书写某些字符串的工作量;提高程序的可读性;程序会更加易于修改,例如上例中如果需要修改PI值的大小,只需要修改宏定义即可。
(2)带参数的宏定义
宏定义可以带参数,这些参数相当于实际参数的占位符。
定义格式:#define 宏名(形参列表) 宏体
形参列表中是宏的参数(由逗号分隔),这些参数可以在宏体中根据需要出现任意多次。 带参数的宏定义不仅要进行字符串替换,还要进行参数替换。 例如:
#define SUM(a,b) a+b
则语句s=SUM(5, 3); 在编译阶段将被展开为s=5+3;然后再编译成可执行代码。
使用带参数的宏定义要注意一下几点:
a.宏定义时宏名与后面的括号之间没有空格,当宏名后出现空格,这个宏会被认为是一个不带参数的宏,空格后的所有字符都看成是宏体。 例如:
#define SUM (a,b) a+b /*SUM是宏名,“(a,b)a+b”被联合成宏体*/
b.在一个带参数的宏定义中,应该使用括号()将带运算符的宏体和形参括起来。如果省略()可能导致错误。
例如上题中,如果将a+b的值作为圆半径,源程序代码为:
#define PI 3.141526
#define Area(r) PI*r*r
#include <stdio.h>
main()
{ float a , b , area ;
a = 3.0 ; b = 1.0 ;
area = Area(a+b); /*r为a+b结果值*/
printf( “Area= %f \n”, area) ;
}
在进行宏名及参数替换后,area=Area(a+b);被原样展开为:area=3.141526*3.0+1.2*3.0+1.2; 与要求的计算过程不相符。
如果将宏定义修改为:#define Area(r)PI*(r)*(r),
对应语句展开后变为:area=3.14159*(3.0+1.2)*(3.0+1.2);即可达到要求。