Могу ли я создать другие # define с помощью функции препроцессора?

Я знаю, что я буду наказан за это, но я бы хотел сделать что-то вроде этого:

#define DEF_CLASS(x) \
#define CLASS x \
#define CONSTRUCTOR CLASS::CLASS \
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)

То есть я хотел бы иметь функцию «#define», которая динамически определяет другие «#defines».

У меня есть IDE, которая не способна к рефакторингу, кроме того, я бы хотел, чтобы конструкторы, особенно конструктор копирования, выделялись из-за его особой роли.
Поэтому я стремлюсь запрограммировать свои определения класса C ++ следующим образом:

CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}

Для этого в настоящее время мне нужно скопировать&вставьте три #define строки. Я бы предпочел сделать это автоматически. Есть ли способ осуществить это с помощью препроцессора?

1

Решение

Нет, такая DEF_CLASS(x) макрос не возможен. Макросы не с состоянием. Лучшее, что вы можете сделать, это:

#define CONSTRUCTOR CLASS::CLASS
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)

...

#define CLASS X
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS

#define CLASS Y
CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
//...
}
#undef CLASS

Но я сильно призываю вас не злоупотреблять таким препроцессором. Зачем запутывать нормальный синтаксис C ++ с этими макросами? Принять C ++ за то, что он есть; не пытайтесь сделать это на другом, более дружественном языке.

1

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

Нет — §16.3.4 / 3:

Результирующая полностью заменяемая макросом последовательность токенов предварительной обработки не обрабатывается как директива предварительной обработки, даже если она похожа на одну […]

2

По вопросам рекламы [email protected]