您好,我正在尝试生成一个宏,该宏获取一个参数并尝试向其添加后缀。
#define myPostFix HelloWorld
#define macro(x) x ##myPostFix
#define CAlgThreadHandleObject macro(CAlgThreadHandleObject)
预期的行为是
CAlgThreadHandleObjectHelloWorld
我得到的是:
CAlgThreadHandleObjectmyPostFix
有人能帮我达到预期的行为吗?
请注意,myPostFix是我必须在项目GCC定义中定义的,它应该因项目而异。
最佳答案
尝试:
#define myPostFix HelloWorld
#define macro_2(x, y) x##y
#define macro_1(x, y) macro_2(x, y)
#define macro(x) macro_1(x, myPostFix)
#define CAlgThreadHandleObject macro(CAlgThreadHandleObject)
您需要中间
macro_1
来让预处理器替换myPostFix
赋值,然后macro_2
来连接字符串。此解决方案允许您将
myPostFix
分配给所需的值。为了阐明预处理器和符号替换是如何工作的,考虑到预处理翻译阶段对参数不是递归的,因此翻译需要通过一次以上的强制参数扩展来扩展所有参数。
在我们的案例中:
CAlgThreadHandleObject
展开为:宏(CAlgThreadHandleObject)macro(CAlgThreadHandleObject)
扩展到:macro_1(CAlgThreadHandleObject, myPostFix)
macro_1
扩展到:macro_2(CAlgThreadHandleObject, HelloWorld)
最后
macro_2
扩展到:CAlgThreadHandleObjectHelloWorld