#define foo Hello#ifdef foo#define wrapper(x) foo ## x#else#define wrapper(x) boo ## x#endif
电话:
wrapper(_world)
我想结果
Hello_world
然而,宏正在将“foo”定义为文字,从而给予
foo_world
有人可以指出我的错误吗?
谢谢
解决方法 我会推荐 gnu-cpp-manual,它清楚地解释了如何扩展宏.宏参数在被替换为宏体之前是完全宏扩展的,除非它们(宏参数)被字符串化或粘贴到其他标记(通过直接应用的宏函数).
例如:
如果参数被字符串化或连接,则不会发生预扫描.
#define AFTERX(x) X_ ## x#define XAFTERX(x) AFTERX(x)#define tableSIZE 1024#define BUFSIZE tableSIZE
AFTERX(BUFSIZE)=> X_BUFSIZE:因为AFTERX是用前缀连接参数,所以它的参数不会扩展,保留BUFSIZE.
XAFTERX(BUFSIZE)=> X_1024:XAFTERX不直接进行连接,因此首先会扩展BUFSIZE.
通常,参数被扫描两次以扩展其中调用的宏.
—编辑—
所以更好的做法是:(代码来自QEMU来源)
#ifndef glue#define xglue(x,y) x ## y#define glue(x,y) xglue(x,y)#define stringify(s) tostring(s)#define tostring(s) #s#endif
glue(x,y)将x和y连接在一起,已经展开.
总结以上是内存溢出为你收集整理的C宏建筑与定义全部内容,希望文章能够帮你解决C宏建筑与定义所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)