C宏建筑与定义
发布时间:2020-12-16 09:45:45 所属栏目:百科 来源:网络整理
导读:我无法正确使用这个宏扩展 #define foo Hello#ifdef foo#define wrapper(x) foo ## x#else#define wrapper(x) boo ## x#endif 电话: wrapper(_world) 我想结果 Hello_world 然而,宏正在将“foo”定义为文字,从而给予 foo_world 有人可以指出我的错误吗? 谢
我无法正确使用这个宏扩展
#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连接在一起,已经展开. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |