Huntsmen 发表于 2008-12-27 02:30

关于#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)为何不一样?宏展开是怎么展开的

emacsnw 发表于 2008-12-27 02:48

原帖由 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那节。

Huntsmen 发表于 2008-12-27 03:09

如果
#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 编辑 ]

dreamice 发表于 2008-12-27 08:49

原帖由 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)为何不 ...

其实就是将参数转换成字符串的一个扩展的宏定义

argstormsky 发表于 2008-12-27 10:40

这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子.

Huntsmen 发表于 2008-12-27 10:47

看书没看明白
书上举了个例子
#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:51

原帖由 argstormsky 于 2008-12-27 10:40 发表 http://bbs.chinaunix.net/images/common/back.gif
这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子.


对不起, 我记错了, 不是c陷阱与缺陷. 是我在cu上看到的一个博客, 我找找先.

Huntsmen 发表于 2008-12-27 11:02

原帖由 argstormsky 于 2008-12-27 10:51 发表 http://bbs.chinaunix.net/images/common/back.gif



对不起, 我记错了, 不是c陷阱与缺陷. 是我在cu上看到的一个博客, 我找找先.
我把第6章看完了也没有发现你说的那个 呵呵
好的 谢谢了

argstormsky 发表于 2008-12-27 11:12

找不到了, 我自己讲讲我的理解.

#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 编辑 ]

雨过白鹭洲 发表于 2008-12-27 11:17

#就是展开为字符串
页: [1] 2
查看完整版本: 关于#define A(x) #x 宏是如何展开的