Есть ли механизм на C++, который я мог бы использовать для реализации макроса, так что макрос определяет класс и в то же время множественные вызовы макроса не приводят к ошибке переопределения класса ? Благодаря!Избегание переопределения макроопределенного класса
ответ
Поскольку макрос не может сгенерировать какие-либо директивы препроцессора C++, не существует способа для определения макроса для генерации #define
, который защищает от повторного создания. Вы должны были бы справиться с отдельными органами управления препроцессором, как-то:
#define CLASS_GENERATOR_MACRO(x, y, z) ...defines class x with attributes y, z...
#ifndef GENERATED_CLASS_A
#define GENERATED_CLASS_A
CLASS_GENERATOR_MACRO(a, int, vector<std::string>);
#endif /* GENERATED_CLASS_A */
Однако, нет ничего, что автоматически обеспечивает соблюдение только одно использование CLASS_GENERATOR_MACRO
для создания класса a
. То есть, файл может также содержать:
CLASS_GENERATOR_MACRO(a, double, double);
и компилятор будет жаловаться на переопределение класса (если оба появляются в том же объеме).
Макрос может генерировать вызов _Pragma
. Есть внешний шанс, что ваша система обеспечивает прагму, которая может помочь. Но, скорее всего, это не портативное решение, использующее прагмы.
Это решение предполагает, что желаемое поведение заключается в создании экземпляра нового класса при каждом использовании макроса, но с разными именами.
Можно комбинировать использование __LINE__
macro и pre-processor token pasting operator ##
, чтобы генерировать уникальные маркеры во время создания макросов.
#define LOCAL_CLASS(_Base) class _Base ## __LINE__ { /* class definition */ }
Это может быть использован как таковой:
LOCAL_CLASS(SomeBase);
LOCAL_CLASS(SomeBase);
, который будет генерировать следующий код (при условии, что макросы инстанцируются в строках 2 и 3 исходного файла:
class SomeBase2 { /* class definition */ };
class SomeBase3 { /* class definition */ };
Недостатком этого решения является то, что имя сгенерированного класса изменяется в зависимости от того, где в объявленном файле, и поэтому нельзя полагаться. Это не проблема, если, скажем, класс n ot предназначен для потребления пользователем макроса; класс содержит информацию, которая автоматически регистрируется макросом с помощью внешней библиотеки.
- 1. Избегание переопределения переменных суперкласса. Mangling или альтернативы
- 2. Избегание нескольких экземпляров класса Sequelize
- 3. Ошибка определения переопределения класса
- 4. CSS * стиль переопределения класса
- 5. Уточнение переопределения класса PHP
- 6. переопределения ошибки конструктора класса
- 7. Класс переопределения класса Python
- 8. Переопределения выступающего класса
- 9. Избегание #import заголовка для абстрактного родительского класса
- 10. Избегание вызова защищенного элемента базового класса
- 11. Оператор if для переопределения класса
- 12. Метод переопределения из унаследованного класса
- 13. Операторы переопределения для существующего класса
- 14. метод переопределения класса в python
- 15. Метод переопределения из назначенного класса
- 16. Свойство поведения переопределения класса CSS
- 17. Scala метод переопределения класса Java
- 18. Инициализировать модуль переопределения класса Ruby
- 19. Методы переопределения класса или класс
- 20. JavaScript метод переопределения класса условно
- 21. Функция переопределения C++ базового класса
- 22. переопределения полей абстрактного класса Java
- 23. метод переопределения переопределения переменной класса Vs в java
- 24. Избегание виртуальных функций
- 25. Избегание цикла
- 26. методы переопределения базового класса Singleton Sqlite
- 27. Наследование статического класса для переопределения членов
- 28. Плагин Joomla 3 для переопределения класса JMenuSite
- 29. Racket Objective-C FFI - избегать переопределения класса
- 30. Python: использование Mock для переопределения метода класса