假设我有一个C++预处理器宏定义如下:
#define X(s) std::cout << #s
如果我直接使用它:
int main() { X( hello ); }
它按预期工作,并在控制台上打印"hello".
如果我定义另一个调用它的宏:
#define Y X( hello ) #define X(s) std::cout << #s int main() { Y; }
它仍然有效.
但是,如果我尝试X
从两个或更多不同的宏组成调用,我会得到一大堆错误:
#define A X( #define B hello #define C ) #define X(s) std::cout << #s << '\n' int main() { A B C; }
请参阅输出:http://cpp.sh/5ws5k
为什么我不能从两个或多个宏扩展组成一个宏调用,不预处理器递归扩展它们?
为什么我不能从两个或多个宏扩展组成一个宏调用,不预处理器递归扩展它们?
你可以编写宏.预处理器确实递归地扩展宏.
但是,它不会首先扩展宏宽度.它首先扩展了它们的深度.
您遇到了问题,因为您希望预处理器首先扩展宏宽度.
您可以在16.3.4重新扫描和进一步替换 C++ 11标准中阅读有关递归宏扩展的更多信息.