#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf)
(((1U << (bw ## __bf)) - 1)
<< (bs ## __bf))
#define SET_BITS(__dst, __bf, __val)
\
((__dst) = ((__dst) & ~(BIT_MASK(__bf)))
| \
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);
其中的#号是啥意思?
能详细的解释下代码最好?
[url=http://msdn.microsoft.com/en-us/library/09dwwt6y.aspx][/url]
主要用于字符串连接合并操作,linux 下有很多这种用法...
字符串链接,一个例子:把2个字符连接在一起 如果需要输出"a##n",当n=8时输出a8,当n=9时输出a9。
Linux里面也有很多类似的手法,
比如,
#define SETFN(fn) if (drv->fn) drv->drv.fn = amba_##fn
SETFN(probe);
SETFN(remove);
SETFN(shutdown);
这样,使用宏SETFN(fn)
当SETFN(probe)的时候,就变成了
if (drv->fn)
drv->drv.fn = amba_##probe
也就是
if (drv->fn)
drv->drv.fn = amba_probe
此种手法,比较常见与
一系列的,前缀都一样的函数或者变量,
然后通过##将不同的后缀链接起来。
上面的示例代码,那个宏,就可以实现
amba_probe
amba_remove
amba_shutdown
函数名的书写了,避免了重复的书写,
当数量多的时候,逻辑比较清晰,而且也省写一些代码。
##相当于把数字转义了。比如TOKEN##N如果N=9那么这个东西就相当于是TOKEN9