给定以下内容,我如何获得产生ONE TWO THREE
的内容?我似乎无法弄清楚在??
中放入什么来产生预期的concat行为。您似乎无法#define
一个空格。
#include <iostream>
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)
#define CONCAT2(X,Y) X ## Y
#define CONCAT(X,Y) CONCAT2(X,Y)
#define CAT \
ONE \
TWO
#define DOG \
THREE
#define BAT CONCAT(CONCAT(CAT,?? ),DOG)
int main()
{
std::cout << STRINGIFYMACRO(BAT) << std::endl;
return 0;
}
最佳答案
##
运算符用于组合两个连续的 token 。它不能用于合并不是 token 的事物(例如空格),如果结果不是有效的(预处理) token ,也不能使用它。
换句话说,不要使用##
来组合字符串。那不是它的目的,并且将不起作用。
请记住,在C++中,连续字符串将由编译器连接。因此,通常无需连接字符串的内容。即使必须串联内容,也可以不使用 token 串联而这样做,因为字符串的内容不是 token 。 (仅当您尝试从多个组件创建计算的#include
文件名时,才有必要。)
要知道的另一件事是,宏替换内的空格(不在两端)减少为单个空格字符,由stringify运算符保留。
因此,如果您可以使用单个空格字符,则可以执行以下操作:
#include <iostream.h>
#define STRINGIFY(x) #x
#define STRINGIFY_EXPANDED(x) STRINGIFY(x)
#define CAT ONE TWO
#define DOG THREE
#define BAT CAT DOG
int main() {
std::cout << STRINGIFY_EXPANDED(BAT) << '\n';
return 0;
}
Try it online!
否则,您可以将片段分成几部分,然后根据需要将其连接起来:
#define DOG STRINGIFY(ONE) " " STRINGIFY(TWO)
#define CAT STRINGIFY(THREE)
#define BAT DOG "\t" CAT
Try it online!
关于c++ - 如何将空白添加到concat预处理程序宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52561601/