C++ 如何向concat预处理器宏添加空白?
考虑到下面的情况,我如何才能得到能产生C++ 如何向concat预处理器宏添加空白?,c++,c-preprocessor,C++,C Preprocessor,考虑到下面的情况,我如何才能得到能产生1 2 3?我似乎不知道应该在?中放入什么来产生预期的concat行为。你似乎不能定义一个空格 #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
1 2 3
?我似乎不知道应该在?
中放入什么来产生预期的concat行为。你似乎不能定义一个空格
#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;
}
#包括
#定义STRINGIFY(x)#x
#定义字符串化宏(y)字符串化(y)
#定义CONCAT2(X,Y)X##Y
#定义CONCAT(X,Y)CONCAT 2(X,Y)
#定义猫\
一个\
两个
#定义狗\
三
#定义蝙蝠猫(猫,狗)
int main()
{
std::cout运算符##
用于组合两个连续的标记。它不能用于组合非标记的内容(如空格),如果结果不是有效的(预处理)标记,也不能使用它
换句话说,不要使用##
组合字符串。这不是它的用途,也不起作用
<>请记住,在C++中,连续字符串将由编译器连接。因此,通常不需要串接字符串的内容。即使必须连接内容,也可以不用标记连接来完成,因为字符串的内容不是令牌。(仅当您试图从多个组件创建计算的#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;
}
首先字符串化,然后串接字符串。反之亦然。您不能有带空格的标记,但可以有一个字符串。\ifdef\uuucplusplus
/\error-error-error编译器
/\endif
提示:char*str=“一”“二”“三”
与char*str=“一”“二”“三”相同
#定义蝙蝠猫狗
?
#define DOG STRINGIFY(ONE) " " STRINGIFY(TWO)
#define CAT STRINGIFY(THREE)
#define BAT DOG "\t" CAT