/ / Чи можу я створити інший # define з функцією препроцесора? - c ++, препроцесор-директива

Чи можу я створити інші # define з функцією препроцесора? - c + +, директива передпроцесора

Я знаю, що буду покараний після того, як запитав це, але я хотів би зробити щось подібне

#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 для відповіді № 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 ++ для свого; не намагайтеся перетворити його на іншу, дружню мову.


2 для відповіді № 2

Ні - §16.3.4 / 3:

Послідовність маркера попередньої обробки, що повністю замінена макросом, не обробляється як директива попередньої обробки, навіть якщо вона нагадує одну [...]