Я знаю, що буду покараний після того, як запитав це, але я хотів би зробити щось подібне
#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:
Послідовність маркера попередньої обробки, що повністю замінена макросом, не обробляється як директива попередньої обробки, навіть якщо вона нагадує одну [...]