我正试图制作一个带有预定义前缀的宏,并将其连接到宏参数中所需的函数名,但没有成功。
例如,虽然这是所需的函数签名:
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