C++宏不替代?
C++ macro doesn't substitute?
这是代码。
#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++ 语言的宏替换规则阻止预处理器递归替换与 ##
或 #
运算符相邻的标记中的宏名称。您需要一个额外的 "isolation" 级别,以确保 gao
在 变为 ##
或 [= 之前被 falsegao
替换13=]。
不,##
运算符的优先级高于参数替换。习惯上它被包裹在一个宏中:
#define CAT_LITERAL( A, B ) A ## B
#define CAT( A, B ) CAT_LITERAL( A, B )
#
运算符也是如此。
#define STR_LITERAL( LIT ) # LIT
#define STR( PARAM ) STR_LITERAL( PARAM )
所以你的宏被定义为:
#define fun(entity) \
void CAT( fun_, entity ) () \
{ \
std::cout << STR( entity ) << std::endl; \
}
这是代码。
#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++ 语言的宏替换规则阻止预处理器递归替换与 ##
或 #
运算符相邻的标记中的宏名称。您需要一个额外的 "isolation" 级别,以确保 gao
在 变为 ##
或 [= 之前被 falsegao
替换13=]。
不,##
运算符的优先级高于参数替换。习惯上它被包裹在一个宏中:
#define CAT_LITERAL( A, B ) A ## B
#define CAT( A, B ) CAT_LITERAL( A, B )
#
运算符也是如此。
#define STR_LITERAL( LIT ) # LIT
#define STR( PARAM ) STR_LITERAL( PARAM )
所以你的宏被定义为:
#define fun(entity) \
void CAT( fun_, entity ) () \
{ \
std::cout << STR( entity ) << std::endl; \
}