一、宏定义在生成可执行文件时的处理:

       将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、带参数的宏定义,其参数在后面引用的时候加上小括号“()”更保险,防止传参的时候使用表达式,由于运算符的优先级带来不必要的、难以想到的错误。