我怎样才能在另一个宏中使用一个宏,以便将宏的定义连接到某个东西? C/C++
How can I use a macro inside another macro in order to concat the definition of the macro to something? C/C++
我正在尝试制作一个宏,它将采用预定义的前缀并将其连接到宏参数中所需的函数名称,但我一直没有成功。
例如,虽然这是想要的函数签名:
void somePrefix__someFunc(int a)
但是,当我 运行 它并检查程序的符号 table 时,我最终扩展了:
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: %d\n",__func__, a);
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}
输出:
somePrefix_someFunc: 2
我正在尝试制作一个宏,它将采用预定义的前缀并将其连接到宏参数中所需的函数名称,但我一直没有成功。
例如,虽然这是想要的函数签名:
void somePrefix__someFunc(int a)
但是,当我 运行 它并检查程序的符号 table 时,我最终扩展了:
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: %d\n",__func__, a);
}
int main()
{
FUNC_NAME(someFunc)(2);
return 0;
}
输出:
somePrefix_someFunc: 2