This question already has answers here:
How to concatenate twice with the C preprocessor and expand a macro as in “arg ## _ ## MACRO”?
(2个答案)
4年前关闭。
这是代码。
该程序将编译并轻松运行。但为什么?我已经将
请帮助我解决这个难题,什么时候进行替换?这背后的原理是什么?
这将按预期工作。
C ++语言的宏替换规则防止预处理器递归替换与
(2个答案)
4年前关闭。
这是代码。
#include <iostream>
using namespace std;
#define gao falsegao
#define fun(entity) \
void fun_##entity() \
{ \
std::cout << #entity << std::endl; \
}
fun(gao);
int main()
{
fun_gao();
return 0;
}
该程序将编译并轻松运行。但为什么?我已经将
gao
定义为falsegao
,生成的函数不应该是void fun_false_gao()
吗?输出也应该是false_gao
。请帮助我解决这个难题,什么时候进行替换?这背后的原理是什么?
最佳答案
您需要一个两层的fun
宏
#define fun_(entity) \
void fun_##entity() \
{ \
std::cout << #entity << std::endl; \
}
#define fun(entity) fun_(entity)
这将按预期工作。
C ++语言的宏替换规则防止预处理器递归替换与
##
或#
运算符相邻的令牌中的宏名称。您需要附加级别的“隔离”,以确保在gao
或falsegao
之前将##
替换为#
。关于c++ - C++宏不能替代吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31800561/
10-13 09:09