[英]Print a #define macro using std::cout
我正在尝试这样做
#define _TEST_ test
#include <iostream>
int main()
{
std::cout << "_TEST_" << std::endl;
}
据我了解,我希望这个 output。
test
但是,我得到的 output 是
_TEST_
为什么我在这里做错了?
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;
}
您可以阅读上面的链接了解为什么我们需要那些额外的两层间接( xstr
和str
),但基本思想是#
本身不进行宏扩展,因此通过调用xstr
,我们强制对参数进行宏扩展( _TEST_
进入test
,即),然后我们分别调用str
对其进行字符串化。 如果我们只是直接调用str
,它会看到#_TEST_
而不会执行宏扩展。
"_TEST_"
是字符串文字而不是宏。 因此,由于"_TEST_"
,将不会进行任何宏替换。 要实现预期的 output,您需要删除周围的双引号并将宏更改为如下所示
//-------------vvvvvv--->double quotes added here
#define _TEST_ "test"
#include <iostream>
int main()
{
//-------------------vvvvvv---------------> not withing quotes
std::cout << _TEST_ << std::endl;
}
上面修改后的程序的output为:
test
在修改后的程序中,宏_TEST_
代表字符串文字"test"
。 因此,当我们在语句std::cout << _TEST_ << std::endl;
中使用该宏时 ,它将被字符串文字替换,产生预期的 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.