宏内部的字符串连接

时间:2014-03-24 09:33:10

标签: c++ macros c-preprocessor stringification

要打印结构的多个字段,我必须反复说出以下行:

cout << "field1=" << ptr->get_field1()

所以我定义了以下宏,并像这样使用它:

#define FIELD(s, id) << s"=" << ptr->get_##id()

FIELD("field1", field1);
FIELD("field2", field2);

这很有效。但我必须在宏中两次提到相同的名称 - 一次作为字符串,另一次作为变量。有没有更好的方法呢?

(这个问题的标题并不完全表明问题,但我想不出一个更合适的短语组合。抱歉!)

3 个答案:

答案 0 :(得分:2)

这应该有效:

#define FIELD(id) << #id "=" << ptr->get_##id()

宏中的#运算符表示“将其变为字符串”。

答案 1 :(得分:2)

您应该stringify id

#define FIELD(id) << #id "=" << ptr->get_##id()

FIELD(field1);   // << "field1" "=" << ptr->get_field1()
FIELD(field2);   // << "field2" "=" << ptr->get_field2()

LIVE EXAMPLE

对于FIELD(field1),它部分导致了这个表达式:

"field1" "="

这是两个并排放置的文字字符串。然后连接这两个,产生相当于"field1="的字符串。

答案 2 :(得分:0)

'#'可以解决问题:

#define FIELD(s) << #s"=" << ptr->get_##s()

甚至:

#define FIELD(i)  << "field"#i"=" << ptr->get_field##i()