免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10603 | 回复: 10
打印 上一主题 下一主题

关于#define A(x) #x 宏是如何展开的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-27 02:30 |只看该作者 |倒序浏览
今天看u-boot的源码,发现
#define XMK_STR(x)        #x
#define MK_STR(x)        XMK_STR(x)
上网搜了一下,#x就是给x加双引号

自己写了几句测试:


A(1234)和B(1234)执行的结果一样,但是A(x)和B(x)为何不一样?宏展开是怎么展开的

论坛徽章:
0
2 [报告]
发表于 2008-12-27 02:48 |只看该作者
原帖由 Huntsmen 于 2008-12-26 10:30 发表
今天看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那节。

论坛徽章:
0
3 [报告]
发表于 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 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-12-27 08:49 |只看该作者
原帖由 Huntsmen 于 2008-12-27 02:30 发表
今天看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)为何不 ...


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

论坛徽章:
0
5 [报告]
发表于 2008-12-27 10:40 |只看该作者
这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子.

论坛徽章:
0
6 [报告]
发表于 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

费解

论坛徽章:
0
7 [报告]
发表于 2008-12-27 10:51 |只看该作者
原帖由 argstormsky 于 2008-12-27 10:40 发表
这点c陷阱与缺陷与处理器一节有详细解释, 而且他举出了宏展开可不展开的例子.



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

论坛徽章:
0
8 [报告]
发表于 2008-12-27 11:02 |只看该作者
原帖由 argstormsky 于 2008-12-27 10:51 发表



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

我把第6章看完了也没有发现你说的那个 呵呵
好的 谢谢了

论坛徽章:
0
9 [报告]
发表于 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 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-12-27 11:17 |只看该作者
#就是展开为字符串
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP