首页 理论教育单片机基础:宏定义命令#define及应用

单片机基础:宏定义命令#define及应用

【摘要】:宏定义命令为#define。实际使用宏定义时,按一般习惯,通常将宏符号名用大写字母表示,以区别于其他的变量名。在进行宏定义时,可以引用已经定义过的宏符号名,即可以进行层层代换,但最多不能超过8级嵌套。宏符号名的有效范围是从宏定义命令#define开始,直到本源文件结束。通常将宏定义命令#define写在源程序的开头、函数的外面,作为源文件的一部分,从而在整个档范围内有效。需要时可以用命令#undef来终止宏定义的作用域。

宏定义命令为#define。它的作用是用一个字符串来进行替换,而这个字符串既可以是常数,也可以是其他任何字符串,甚至还可以是带参数的宏。宏定义的简单形式是符号常量定义,复杂形式是带参数的宏定义。

1.不带参数的宏定义

不带参数的宏定义又称为符号常量定义,一般格式如下:

其中,“标识符”是所定义的宏符号名(也称为宏名),它的作用是在程序中使用指定的标识符代替指定的常量表达式。例如,“#define PI 3.141592”就是用PI这个符号来代替常数3.141592。使用了这个宏定义之后,程序中就不必每次都写出常数3.141592,而可以用符号PI代替。在编译时,编译器会自动将程序中所有的符号名PI都替换成常数3.141592。这种方法使编程人员可以在C语言源程序中用一个简单的符号名来替换一个很长的字符串,还可以使用一些有一定意义的标识符,以提高程序的可读性。

实际使用宏定义时,按一般习惯,通常将宏符号名用大写字母表示,以区别于其他的变量名。宏定义不是C语言的语句,因此在宏定义行的末尾不要加分号,否则在编译时将连同分号一起进行替换而导致出现语法错误。在进行宏定义时,可以引用已经定义过的宏符号名,即可以进行层层代换,但最多不能超过8级嵌套。需要注意的是,预处理命令对于程序中用双引号括起来的字符串内的字符,即使该字符与宏符号名相同也不作替换。

宏符号名的有效范围是从宏定义命令#define开始,直到本源文件结束。通常将宏定义命令#define写在源程序的开头、函数的外面,作为源文件的一部分,从而在整个档范围内有效。需要时可以用命令#undef来终止宏定义的作用域。

2.带参数的宏定义

带参数的宏定义与符号常量定义的不同之处在于,对于源程序中出现的宏符号名不仅进行字符串替换,而且还能进行参数替换。带参数宏定义的一般格式如下:(www.chuimin.cn)

#define 宏符号名(参数表) 表达式

其中,表达式内包含了在括号中所指定的参数,这些参数称为形式参数,在以后的程序中它们将被实际参数所替换。带参数的宏定义将一个带形式参数的表达式定义为一个带形式参数表的宏符号名,对程序中所有带实际参数表的该宏符号名,用指定的表达式来替换,同时用参数表中的实际参数替换表达式中对应的形式参数。下面通过一些实例来说明带参数的宏定义的用法。

带参数的宏定义常用来代表一些简短的表达式,它用来将直接插入的代码代替函数调用,从而提高程序的执行效率。例如:

该语句定义了一个带参数的宏MIN(x,y),以后在程序中就可以用这个宏而不用函数MIN()。例如,语句“m=MIN(u,v);”经宏展开后成为“m=(((u)<(v))?(u):(v))”。

宏定义的应用,举例如下:

程序执行结果:

这个例子实现的功能,为将片内存储区30H和31H中的数据中的较小的值存放至片内存储区40H中。