CAlgThreadHandleObject

CAlgThreadHandleObject

您好,我正在尝试生成一个宏,该宏获取一个参数并尝试向其添加后缀。

#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

08-26 09:20