使用 std::cout 打印 #define 宏

Print a #define macro using std::cout

我正在尝试这样做

#define _TEST_ test
#include <iostream>

int main()
{
        std::cout << "_TEST_" << std::endl;
}

据我了解,我希望得到这样的输出。

test

然而,我得到的输出是

_TEST_

为什么我这里做错了?

"_TEST_" 字符串文字 而不是宏。因此,由于 "_TEST_",将不会进行任何宏替换。为了达到预期的输出,您需要删除周围的双引号并将宏更改为如下所示

//-------------vvvvvv--->double quotes added here
#define _TEST_ "test" 
#include <iostream>

int main()
{
//-------------------vvvvvv---------------> not withing quotes
        std::cout << _TEST_ << std::endl;
}

以上修改后的程序输出为:

test

Demo

说明

在修改后的程序中,宏_TEST_代表字符串文字"test"。因此,当我们在语句 std::cout << _TEST_ << std::endl; 中使用该宏时,它将被字符串文字替换,从而产生预期的输出。

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;
}

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