VC ++ marco,获取参数的原始文本

时间:2014-11-10 19:02:26

标签: c++ macros

如何获取提供给value的数据文本,而不是执行表达式的值?

#define PRINT_VALUE(value) std::cout << "Value " << __RAWTEXT(value) << " is " << value << "\n";

__RAWTEXT是我编造的东西。那会有什么东西可以做到这一点吗?

int testVariable = 5;
PRINT_VALUE(testVariable);

这个的输出应该是

  

值testVariable是5

1 个答案:

答案 0 :(得分:0)

使用“stringize”运算符#

#define PRINT_VALUE(value) std::cout << "Value " << #value << " is " << value << "\n";

非常简单,宏中的#TTT会将TTT转换为"TTT",这是一个字符串文字。

<小时/> 值得一提的是,当参数本身一个宏时,你将获得宏的名称。但是,如果参数传递给后续宏,则将其“解压缩”。所以你有时会看到这些:

#define STRINGIZE2(X) #X
#define STRINGIZE(X) STRINGIZE2(X)

他们在这里行动:

#define TEST Bob
std::cout << #TEST; //results in "TEST"
std::cout << STRINGIZE2(TEST); //results in "TEST"
std::cout << STRINGIZE(TEST); //results in "Bob"

<小时/> 与你的问题无关,但值得注意的是“concat”宏操作符##,它“胶合”两位文本togeather。 std::st ## ing会产生std::string。在宏中很有用:

 #define make_thing(X) \
 structX##_class {
     static const char* const name=#X;
 };
 make_thing(Foo);
 std::cout << Foo_class::name;

同样,如果参数是宏,则获得宏名称。所以这是de宏宏:

#define GLUE2(X,Y) (X##Y)
#define GLUE(X,Y) GLUE2(X,Y)

#define HEY "HELLO"
#define THERE "WORLD"
std::cout << GLUE(HEY,THERE); //"HELLOWORLD"