使用 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
说明
在修改后的程序中,宏_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 了解为什么我们需要额外的两层间接(xstr
和 str
),但基本思想是 #
本身不进行宏扩展,因此通过调用 xstr
,我们强制对参数进行宏扩展(_TEST_
到 test
),然后分别 我们调用 str
来对其进行字符串化。如果我们直接调用 str
,它会看到 #_TEST_
而 不会 执行宏扩展。
我正在尝试这样做
#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
说明
在修改后的程序中,宏_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 了解为什么我们需要额外的两层间接(xstr
和 str
),但基本思想是 #
本身不进行宏扩展,因此通过调用 xstr
,我们强制对参数进行宏扩展(_TEST_
到 test
),然后分别 我们调用 str
来对其进行字符串化。如果我们直接调用 str
,它会看到 #_TEST_
而 不会 执行宏扩展。