Чтобы напечатать несколько полей структуры, я должен повторить следующую строку:
cout << "field1=" << ptr->get_field1()
Поэтому я определил следующий макрос и использую его следующим образом:
#define FIELD(s, id) << s"=" << ptr->get_##id()
FIELD("field1", field1);
FIELD("field2", field2);
Это работает. Но я должен упомянуть одно и то же имя дважды в макросе — один раз как строку, другой раз как переменную. Есть ли лучший способ сделать это?
(Название этого вопроса точно не указывает на вопрос, но я не мог придумать более подходящую короткую комбинацию слов. Извините за это!)
Вам следует stringify id
:
#define FIELD(id) << #id "=" << ptr->get_##id()
FIELD(field1); // << "field1" "=" << ptr->get_field1()
FIELD(field2); // << "field2" "=" << ptr->get_field2()
За FIELD(field1)
, это частично приводит к этому выражению:
"field1" "="
это две буквенные строки, помещенные рядом. Эти два затем объединяются, в результате чего получается строка, эквивалентная "field1="
,
Это должно работать:
#define FIELD(id) << #id "=" << ptr->get_##id()
Оператор # в макросе означает «превратить это в строку».
‘#’ делает трюк:
#define FIELD(s) << #s"=" << ptr->get_##s()
или даже:
#define FIELD(i) << "field"#i"=" << ptr->get_field##i()