如何将空格添加到 concat 预处理器宏?
How do I add whitespace to a concat preprocessor macro?
鉴于以下情况,我怎样才能得到产出 ONE TWO THREE
的东西?我似乎无法弄清楚要在 ??
中放入什么才能产生预期的 concat 行为。你似乎 #define
一个 space.
#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;
}
##
运算符用于组合两个连续的tokens。它不能用于组合不是标记的东西(例如 whitespace),如果结果不是有效的(预处理)标记,也不能使用它。
换句话说,不要使用##
来组合字符串。这不是它的目的,它不会起作用。
请记住,在 C++ 中,编译器会连接连续的字符串。所以通常不需要连接字符串的内容。即使您必须连接内容,也可以在没有标记连接的情况下执行此操作,因为字符串的内容不是标记。 (仅当您尝试从多个组件创建计算的 #include
文件名时才需要这样做。)
另一件需要知道的有用的事情是,宏替换中的 whitespace 被简化为单个 space 字符,由 stringify 运算符保留。
因此,如果您对单个 space 字符没问题,您可以这样做:
#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;
}
否则,您可以分段进行字符串化并根据需要连接这些分段:
#define DOG STRINGIFY(ONE) " " STRINGIFY(TWO)
#define CAT STRINGIFY(THREE)
#define BAT DOG "\t" CAT
鉴于以下情况,我怎样才能得到产出 ONE TWO THREE
的东西?我似乎无法弄清楚要在 ??
中放入什么才能产生预期的 concat 行为。你似乎 #define
一个 space.
#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;
}
##
运算符用于组合两个连续的tokens。它不能用于组合不是标记的东西(例如 whitespace),如果结果不是有效的(预处理)标记,也不能使用它。
换句话说,不要使用##
来组合字符串。这不是它的目的,它不会起作用。
请记住,在 C++ 中,编译器会连接连续的字符串。所以通常不需要连接字符串的内容。即使您必须连接内容,也可以在没有标记连接的情况下执行此操作,因为字符串的内容不是标记。 (仅当您尝试从多个组件创建计算的 #include
文件名时才需要这样做。)
另一件需要知道的有用的事情是,宏替换中的 whitespace 被简化为单个 space 字符,由 stringify 运算符保留。
因此,如果您对单个 space 字符没问题,您可以这样做:
#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;
}
否则,您可以分段进行字符串化并根据需要连接这些分段:
#define DOG STRINGIFY(ONE) " " STRINGIFY(TWO)
#define CAT STRINGIFY(THREE)
#define BAT DOG "\t" CAT