一、宏定义在生成可执行文件时的处理:
将c语言源程序变成可执行文件需要经历:预处理、汇编、编译、链接四个阶段,可见预处理是最先执行的步骤,预处理是由预处理器来完成,源文件中的宏就是在预处理的时候被替换的,即用真正的关键字或者语句代替宏名,仅仅是字符的简单替换,不做任何语法的检查。
二、带参数的宏定义的一般形式:
#define 宏名(参数表) 宏体
1、宏名:是一个标识符
2、参数表:参数可以是一个,也可以是多个
3、宏体:是被替换的字符串,即由参数表中的参数组成的表达式。
4、实例:
#define MAX(x,y) ((x) > (y) ? (x) : (y))
三、宏定义的好处:
1、少些很多代码。
2、看起来很简洁。
3、修改起来方便,当宏定义的东西在多出应用时,如果需要更改的时候,不需要一个一个地去修改,只需要改下宏定义,就轻松搞定!
4、带参数的宏定义,不针对某个具体的数据类型,这样以无“型”胜有“型”了,任何类型的数据都可以用。
四、多行宏定义的形式:
在写宏定义的时候,如果需要多行书写的时候,需要反斜杠“\”来告诉编译器,此行命令未结束。
举例:……
……例子后面会有滴,别着急!
五、多条执行语句的宏定义(程序块的宏定义):
当宏定义程序块的时候,也就是不止一条语句的时候,我们就会用到这个结构:
do{}while(0);
为啥是他呢?不是她?不是它?当然了,你认为是她or它,都可以的,这个语句是很好的,任何情况下都会执行一遍。我们的宏定义,不正是如此么?
来个例子:
#define SWAP(x, y) do{ \
(x) = ((x) ^ (y)); \
(y) = ((x) ^ (y)); \
(x) = ((x) ^ (y)); \
}while(0);
这就定义了一个程序块,功能是交换两个数据的值,是带多个参数、多行、多条语句,三多的完美体现。
六、使用注意事项:
1、宏定义一般都大写,以示区别,这不是绝对的,是约定俗成的,大家都这么来。
2、带参数的宏定义,其参数在后面引用的时候加上小括号“()”更保险,防止传参的时候使用表达式,由于运算符的优先级带来不必要的、难以想到的错误。