使用 std::cout 打印 #define 宏

Gya*_*ash 0 c++ gcc9

我正在尝试这样做

#define _TEST_ test
#include <iostream>

int main()
{
        std::cout << "_TEST_" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

据我了解,我期望这个输出。

test
Run Code Online (Sandbox Code Playgroud)

但是,我得到的输出是

_TEST_
Run Code Online (Sandbox Code Playgroud)

为什么我在这里做错了?

Sil*_*olo 7

C/C++ 预处理器中的宏扩展仅发生在标记上。例如,变量名称就是标记。但字符串的内部并不是一个令牌;而是一个令牌。它是更大标记的一部分(即字符串文字本身)。

如果您希望宏扩展到引号内的内容,则需要使用stringification

#define xstr(x) str(x)
#define str(x) #x
#define _TEST_ test
#include <iostream>

int main()
{
        std::cout << xstr(_TEST_) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

您可以阅读上面的链接,了解为什么我们需要额外的两层间接层(xstrstr),但基本思想是它#本身不进行宏扩展,因此通过调用xstr,我们强制对参数进行宏扩展(_TEST_into test,即),然后我们分别str调用对其进行字符串化。如果我们直接调用str,它会看到#_TEST_并且不会执行宏扩展。