Макрос для создания нескольких одинаковых идентификаторов для тестирования

Я хотел написать простой макрос для расширения некоторых идентификаторов, чтобы он избавлял меня от необходимости вводить все снова и снова, когда у меня есть похожий код для тестирования для множества различных классов.

Я хотел что-то вроде этого:

#define TST(x)  x## x##_1(2);                   \
                x## x##_2;                      \
                                                \
                x##_1.print(cout);              \
                x##_2.print(cout);              \
                x##_2.elem(3);                  \
                x##_2.elem(4);                  \
                x##_2.print(cout)

Быть переведенным на

Pentagonal Pentagonal_1(2);
Pentagonal Pentagonal_2;

Pentagonal_1.print(cout);
Pentagonal_2.print(cout);
Pentagonal_2.elem(3);
Pentagonal_2.elem(4);
Pentagonal_2.print(cout);

всякий раз, когда я звоню

TST(Pentagonal);

до сих пор это переводится склеены как

PentagonalPentagonal_1

Я пытался найти это, но в этом конкретном случае я не мог найти большую помощь в другом месте.

1 ответ

Решение

Изменить:

#define TST(x)  x## x##_1(2);                   \
                x## x##_2;                      \

...

в

#define TST(x)  x x##_1(2);                   \
                x x##_2;                      \

...

## является оператором вставки токенов: он "поглощает" окружающие пробелы и объединяет соседние токены в один.

Дополнения, которые у вас были там, вставляли Pentagonal а также Pentagonal_1 все вместе.

Другие вопросы по тегам