关于#define A(x) #x 宏是如何展开的
今天看u-boot的源码,发现#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
上网搜了一下,#x就是给x加双引号
自己写了几句测试:
A(1234)和B(1234)执行的结果一样,但是A(x)和B(x)为何不一样?宏展开是怎么展开的 原帖由 Huntsmen 于 2008-12-26 10:30 发表 http://bbs.chinaunix.net/images/common/back.gif
今天看u-boot的源码,发现
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
上网搜了一下,#x就是给x加双引号
自己写了几句测试:
309130
A(1234)和B(1234)执行的结果一样,但是A(x)和B(x)为何不 ...
#define xx 317
A(xx) 展开成 "xx"
B(xx) 展开成 A(317),进而展开成 "317".
去看看The C programming language的带参数宏参数evaluation那节。 如果
#define A(x) #x
#define B(x) A(x)
#define C(x) B(x)
#define x 3
#define y x
B(y) C(y)是如何展开的,我理解的是一级一级的展开
B(y)->A(x)->"x" 但结果是"3"
C(y)->B(x)->A(3)->"3" 结果"3"
[ 本帖最后由 Huntsmen 于 2008-12-27 09:15 编辑 ] 原帖由 Huntsmen 于 2008-12-27 02:30 发表 http://bbs.chinaunix.net/images/common/back.gif
今天看u-boot的源码,发现
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)
上网搜了一下,#x就是给x加双引号
自己写了几句测试:
309130
A(1234)和B(1234)执行的结果一样,但是A(x)和B(x)为何不 ...
其实就是将参数转换成字符串的一个扩展的宏定义 这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子. 看书没看明白
书上举了个例子
#define cat(x,y) x ## y
cat(12,34); 展开后为1234
cat(cat(1,2),3); 展开后为cat(1,2)3
但是改成
#define cat(x,y) x ## y
#define xcat(x,y) cat(x,y)
xcat(xcat(1,2),3)展开就是123
费解 原帖由 argstormsky 于 2008-12-27 10:40 发表 http://bbs.chinaunix.net/images/common/back.gif
这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子.
对不起, 我记错了, 不是c陷阱与缺陷. 是我在cu上看到的一个博客, 我找找先. 原帖由 argstormsky 于 2008-12-27 10:51 发表 http://bbs.chinaunix.net/images/common/back.gif
对不起, 我记错了, 不是c陷阱与缺陷. 是我在cu上看到的一个博客, 我找找先.
我把第6章看完了也没有发现你说的那个 呵呵
好的 谢谢了 找不到了, 我自己讲讲我的理解.
#define STR(x) #x
#define _STR(x) STR(x)
#define x 123
如果你这样用
STR(x);
如果这时x本身是一个宏, 那么展开会是"x", 而不是"123"
而如果是用
_STR(x);
那么会展开宏定义里的宏, 结果就是"123".
windows里用这个解决字符问题用的很多.
[ 本帖最后由 argstormsky 于 2008-12-27 11:14 编辑 ] #就是展开为字符串
页:
[1]
2