简单宏容易理解,如:
#define PI 3.14
带参数的宏以及宏嵌套:
#define FIRST_IMG_ADDR 0x9f600000
#define _BOOTCMD(addr) "bootm "#addr
#define BOOTCMD(addr) _BOOTCMD(addr)
BOOTCMD(FIRST_IMG_ADDR)
使用BOOTCMD
时就像函数一样使用,方便。如上语句BOOTCMD(FIRST_IMG_ADDR)
,如果要修改启动地址时,只需要修改FIRST_IMG_ADDR
的定义即可。
上面代码第二行中的#
号的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.
对于##
号,则被称为连接符(concatenator),用来将两个Token连接为一个Token。
下面来看看它们是怎样工作的。这是MSDN上的一个例子。假设程序中已经定义了这样一个带参数的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同时又定义了一个整形变量: int token9 = 9;
现在在主程序中以下面的方式调用这个宏: paster( 9 );
那么在编译时,上面的这句话被扩展为: printf( "token" "9" " = %d", token9 );
注意到在这个例子中,paster(9);
中的这个”9”
被原封不动的当成了一个字符串,与”token”
连接在了一起,从而成为了token9
。而#n
也被”9”
所替代可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
。