(1)在define后面的#和##
在#define中,标准C只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。
#include <stdio.h>
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
int
main(
int
argc,
char
* argv[] )
{
int
token9 = 10;
paster(9);
return
0;
}
(2)c语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数
比如
#define MAX( a, b ) ((a>b)?(a):(b))
(3)在单片机C编程中,还会有其它类似的形式出现在.h文件中,让人感觉也有类似define的功能(以MSP430的DEFC和DEFW为例)
注意:在MSP430中有如下的扩展关键字
sfrb和sfrw
DEFC
实际上,只不过在头文件中做了点手脚
#define DEFC(name, address) sfrb name = address;
#define DEFW(name, address) sfrw name = address;
#define DEFA(name, address) sfrl name = address;
所以,我们有下列表示:
#define TACTL_ (0x0160u) /* Timer A Control */
DEFW( TACTL , TACTL_)
实际上是前一个为宏定义,而第二个为定义一个寄存器,给出了寄存器名和寄存器地址。