如何在另一个宏中使用宏,以便将宏的定义连接到某个内容?C/C++



我正试图制作一个带有预定义前缀的宏,并将其连接到宏参数中所需的函数名,但没有成功。

例如,虽然这是所需的函数签名:

void somePrefix__someFunc(int a)

然而,当我运行它并检查程序的符号表时,我最终得到了扩展:

FUNC_PREFIXsomeFunc

我做错了什么?我该如何正确地做到这一点?

我试图运行的代码:

#include <iostream>
#define CONCAT(A, B) A##B
#define FUNC_PREFIX somePrefix__
#define FUNC_NAME(_func) CONCAT(FUNC_PREFIX, _func)
void FUNC_NAME(someFunc)(int a)
{
std::cout << a << std::endl;
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}

p.S:我尝试在没有CONCAT包装的情况下使用宏(直接尝试连接FUNC_PREFIX##_func(,但它仍然不起作用。

##总是在宏"之前应用;替换列表";是(重新(扫描的,所以如果在其他项目之前扩展CONCAT,我们将无法获得所需的结果。每当我们在宏替换过程中在替换列表中出现##时,它就会在任何进一步的替换之前应用。

因此,您需要一个额外的辅助宏来扩展FUNC_PREFIX,以便在CONCAT之前进行扩展:

#include <stdio.h>
#define CONCAT(A, B) A##B
#define CONCAT_EXPAND(A, B) CONCAT(A,B)
#define FUNC_PREFIX somePrefix_
#define FUNC_NAME(func) CONCAT_EXPAND(FUNC_PREFIX, func)
void FUNC_NAME(someFunc)(int a)
{
printf("%s: %dn",__func__, a);
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}

输出:

somePrefix_someFunc: 2

最新更新