很多情况下,为了整个程序的方便,我们会使用宏定义,但在宏定义中有很多细节。宏定义只是单纯的进行文本替换,在编译前就已经替换完成,不做表达式计算。
(1)宏名一般用大写 (主要是为了和变量区分,没有硬性要求)
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义
(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
(4)宏定义末尾不加分号;(如果加了分号,则会连分号一起替换)
(5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。
(6)可以用#undef命令终止宏定义的作用域
(7)宏定义允许嵌套 (宏定义允许使用已经定义的宏定义)
(8)字符串( " " )中永远不包含宏
(9)宏定义不分配内存,变量定义分配内存。
(10)宏定义不存在类型问题,它的参数也是无类型的。
还有一种带参数的宏定义。不仅有替换,还有实参替换形参的过程。
(1)要注意参数要加括号,因为不进行表达式计算,不加括号很有可能出现计算先后的错误
(2)带参数宏定义中,宏名与形参表之间不允许有空格。 #define MAX(a,b) (a>b)?a:b
(3)要注意带参数宏和带参数的函数的区别。比如
main()
{
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}
SQ(int y)
{
return((y)*(y));
}
******************************************************************************
#define SQ(y) ((y)*(y))
main()
{
int i=1;
while(i<=5)
printf("%d\n",SQ(i++));
}