深入解析C语言中宏定义的两种格式及注意事项
1、概念

# define命令是C语言里的宏定义命令。它能把一个标识符定义成一个字符串。这个标识符称作宏名。被定义的字符串叫做替换文本。
命令存在两种格式。一种格式为简单的宏定义。另一种格式是带参数的宏定义。
(1)简单的宏定义:
#define
其值为(a的大小)除以(a[0]的大小)
(2)带参数的宏定义#define ()
否则返回b
2、不能忽略宏定义中的空格
下面的宏定义中,f是否带了参数呢?
#define f (x) ((x)+1)
答案是否定的。在f与(x)之间存在一个空格。这使得变成了如下定义。
#define f (x)((x)+1)
预处理程序不会对它进行任何检查。要是有错误,只能在编译源程序时发现。此时源程序已经过宏展开。
3、宏不是函数
如果我们定义一个宏:
#define MAX(a,b) a>b?a:b
当我们执行一个语句:
3+MAX(1,3);
我们期望的正确答案应当是6。实际上,运行后的答案是1。和宏定义相关联的是优先级。算数运算符的优先级高于条件运算符。具体展开如下:
首先进行算符运算符的运算。这里是3 + 1 > 3? 1 : 3 ,运算后变为4 > 3? 1 : 3 。所以答案为1 。
请注意宏定义里的括号,这些括号能预防引发优先级相关问题。有些专家建议,在C语言中牢记两个优先级即可,乘除法优先级高于加减法。设计其他操作符时,都要加上括号
4、宏定义不是说明或语句,在行末不必加分号
比如,加上分号则连分号也一起置换。
5、宏不是类型定义
首先定义一个宏:
#define pChar char*
用pChar定义两个变量。接着用操作符sizeof读取变量所占用内存大小。若变量是指针类型,其占用4个字节。若变量是字符型,其占用1个字节。
结果占用的空间存在差异,变量类型因而不同,所以宏定义并非类型定义。那么,要是我改用typedef来定义类型会怎样呢?
宏定义是简单的字符串代换。它在预处理时完成。typedef在编译时处理。它不是简单代换。而是对类型说明符重新命名。被命名的标识符有类型定义说明。
6、与之相关的宏定义
下面来看一种常用的使用方式
#if defined(CREDIT)credit();#elif defined(DEBIT)debit();#elseprinterror();#endif
7、总结
宏的本质是代码替换。
END