Конкатенация строк внутри макроса

Чтобы напечатать несколько полей структуры, я должен повторить следующую строку:

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

Поэтому я определил следующий макрос и использую его следующим образом:

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

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

Это работает. Но я должен упомянуть одно и то же имя дважды в макросе — один раз как строку, другой раз как переменную. Есть ли лучший способ сделать это?

(Название этого вопроса точно не указывает на вопрос, но я не мог придумать более подходящую короткую комбинацию слов. Извините за это!)

0

Решение

Вам следует 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=",

2

Другие решения

Это должно работать:

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

Оператор # в макросе означает «превратить это в строку».

2

‘#’ делает трюк:

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

или даже:

#define FIELD(i)  << "field"#i"=" << ptr->get_field##i()
0
По вопросам рекламы [email protected]