使用预处理器宏编写另一个宏调用 假设我有一个C++预处理器宏定义如下: #define X(s) std::cout << #s

使用预处理器宏编写另一个宏调用 假设我有一个C++预处理器宏定义如下: #define X(s) std::cout << #s,c++,c-preprocessor,C++,C Preprocessor,它按预期工作,控制台上会打印“hello” 如果我定义了另一个调用它的宏: #define Y X( hello ) #define X(s) std::cout << #s int main() { Y; } 见以下输出: 为什么我不能从两个或多个宏展开组成一个宏调用,预处理器不是递归展开它们吗 为什么我不能从两个或多个宏展开组成一个宏调用,预处理器不是递归展开它们吗 您可以编写宏。预处理器确实以递归方式展开宏 但是,它不会首先扩展宏的宽度。它首先扩展它们的深度 您遇到

它按预期工作,控制台上会打印“hello”

如果我定义了另一个调用它的宏:

#define Y X( hello )
#define X(s) std::cout << #s

int main() {
    Y;
}
见以下输出:

为什么我不能从两个或多个宏展开组成一个宏调用,预处理器不是递归展开它们吗

为什么我不能从两个或多个宏展开组成一个宏调用,预处理器不是递归展开它们吗

您可以编写宏。预处理器确实以递归方式展开宏

但是,它不会首先扩展宏的宽度。它首先扩展它们的深度

您遇到了一个问题,因为您希望预处理器首先扩展宏的宽度


您可以在C++11标准的16.3.4重新扫描和进一步替换中阅读有关递归宏扩展的更多信息。

您应该阅读描述C++11或C99标准的文档。它不像你做梦一样工作。我不知道你在这里想要达到什么……相关的C++标准引用:16.3.4重新扫描和“深度”和“宽度”的进一步替换。将打开的参数从
A
移动到
B
,并给定
#定义I(Q)Q
,然后使用
I(A B C)
,将其删除。
#define Y X( hello )
#define X(s) std::cout << #s

int main() {
    Y;
}
#define A X(
#define B hello
#define C )

#define X(s) std::cout << #s << '\n'


int main()
{
    A B C;
}