定义为某个值 以便后面修改这个值时不用修改其它地方代码 只要修改这个宏的定义就可以了
如一个软件的多语言版本等
#define 标识符 字符串
其中的标识符就是所谓的符号常量,也称为“宏名”
掌握"宏"概念的关键是“换”
无参数宏定义————
其中# define之后的标识符称为宏定义名(简称宏名)
# define TRUE 1
凡定义之后出现的单词TRUE将用1替代之
在新的宏定义中,可以使用前面已定义的宏名。
# define R 2.5*TRUE
程序中统一用宏名表示常量值,便于程序前后统一,不易出错,也便于修改,能提高程序的可读性和可移植性。特别是给数组元素个数一个宏定义,并用宏名定义数组元素个数能部分弥补数组元素个数固定的不足
带参数宏定义————
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参数宏定义进一步扩充了无参数宏定义的能力,在字符序列替换同时还能进行参数替换。带参数定定义的一般形式为
# define 标识符(参数表)字符序列
# define MAX(A,B) ((A) > (B)?(A):(B))
则代码 y= MAX( p+q, u+v)将被替换成 y=((p+q) >(u+v)?(p+q):(u+v)。
# define SQR(x) x*x
P=SQR(y)
能得到希望的宏展开p= y*y。但对于宏调用q=SQR(u+v)得到的宏展开是q=u+V*u+V。
应注意用宏定义表示数据类型和用typedef定义数据说明符的区别————
宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
请看下面的例子:
#define PIN1 int *
typedef (int *) PIN2;
从形式上看这两者相似, 但在实际使用中却不相同。
下面用PIN1,PIN2说明变量时就可以看出它们的区别:
PIN1 a,b;在宏代换后变成:
int *a,b;
表示a是指向整型的指针变量,而b是整型变量。
然而:
PIN2 a,b;
表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。