Экспорт функций
Руководство по экспорту функций из вашего плагина на C++ для использования другими языковыми модулями в Plugify.
В экосистеме Plugify плагины на C++ могут экспортировать функции, чтобы сделать их доступными для других плагинов. Это руководство объясняет, как экспортировать функции в C++, и предоставляет примеры, которые помогут вам беспрепятственно интегрировать ваши плагины.
Базовое сопоставление типов
В следующей таблице перечислены способы представления типов в C++ API:
| Тип C++ | Псевдоним Plugify | Поддержка ссылок ? |
|---|---|---|
| void | void | ❌ |
| bool | bool | ✅ |
| char | char8 | ✅ |
| char16_t | char16 | ✅ |
| int8_t | int8 | ✅ |
| int16_t | int16 | ✅ |
| int32_t | int32 | ✅ |
| int64_t | int64 | ✅ |
| uint8_t | uint8 | ✅ |
| uint16_t | uint16 | ✅ |
| uint32_t | uint32 | ✅ |
| uint64_t | uint64 | ✅ |
| uintptr_t | ptr64 | ✅ |
| uintptr_t | ptr32 | ✅ |
| float | float | ✅ |
| double | double | ✅ |
| void* | function | ❌ |
| plg::string | string | ✅ |
| plg::any | any | ✅ |
| plg::vector<bool> | bool[] | ✅ |
| plg::vector<char> | char8[] | ✅ |
| plg::vector<char16_t> | char16[] | ✅ |
| plg::vector<int8_t> | int8[] | ✅ |
| plg::vector<int16_t> | int16[] | ✅ |
| plg::vector<int32_t> | int32[] | ✅ |
| plg::vector<int64_t> | int64[] | ✅ |
| plg::vector<uint8_t> | uint8[] | ✅ |
| plg::vector<uint16_t> | uint16[] | ✅ |
| plg::vector<uint32_t> | uint32[] | ✅ |
| plg::vector<uint64_t> | uint64[] | ✅ |
| plg::vector<uintptr_t> | ptr64[] | ✅ |
| plg::vector<uintptr_t> | ptr32[] | ✅ |
| plg::vector<float> | float[] | ✅ |
| plg::vector<double> | double[] | ✅ |
| plg::vector<plg::string> | string[] | ✅ |
| plg::vector<plg::any> | any[] | ✅ |
| plg::vector<plg::vec2> | vec2[] | ✅ |
| plg::vector<plg::vec3> | vec3[] | ✅ |
| plg::vector<plg::vec4> | vec4[] | ✅ |
| plg::vector<plg::mat4x4> | mat4x4[] | ✅ |
| plg::vec2 | vec2 | ✅ |
| plg::vec3 | vec3 | ✅ |
| plg::vec4 | vec4 | ✅ |
| plg::mat4x4 | mat4x4 | ✅ |
Экспорт функций в C++
Чтобы экспортировать функцию в плагине на C++, вам необходимо убедиться, что функция видна другим плагинам. Обычно это делается путем пометки функции макросом PLUGIN_API, который обеспечивает экспорт функции при компиляции плагина в виде динамически подключаемой библиотеки (DLL).
Ключевые моменты
- Статические функции: Экспортируемые функции, как правило, должны быть
static, чтобы избежать необходимости в экземпляре объекта для вызова. - С-компоновка: Макрос
PLUGIN_APIне включает автоматическиextern "C"для предотвращения искажения имен (name mangling). Мы должны убедиться, что функцию можно найти просто по имени, добавивextern "C". - Типы параметров и возвращаемых значений: Используйте нативные типы Plugify (например,
plg::string,plg::vector) для бесшовной интеграции.
Генерация макроса PLUGIN_API
Макрос PLUGIN_API генерируется с помощью CMake. Вот как вы можете настроить его в вашем файле CMakeLists.txt:
Это генерирует заголовочный файл (module_export.h), который определяет макрос PLUGIN_API. Включите этот заголовочный файл в исходные файлы вашего плагина, чтобы помечать функции для экспорта.
Базовый пример
Вот простой пример экспорта функции в плагине на C++:
Определение функции
Экспорт функции
Когда плагин будет загружен, функция AddNumbers будет экспортирована и сможет вызываться другими плагинами.
Пример манифеста плагина
Все экспортированные функции должны быть описаны в файле манифеста плагина в разделе methods. Вот пример манифеста для плагина, который экспортирует функцию AddNumbers:
Продвинутый пример: Экспорт сложных функций
Вот пример экспорта функции со сложными типами параметров и возвращаемого значения:
Определение функции
Манифест плагина
Обработка обратных вызовов (callbacks)
Plugify позволяет экспортировать функции, которые принимают обратные вызовы в качестве параметров. Вот пример:
Определение функции
Манифест плагина
Автоматизация генерации манифеста
Новинка: Теперь вы можете автоматизировать генерацию раздела methods в манифесте вашего плагина с помощью clang-doc и парсера на Python!
Вместо ручного написания JSON-манифеста для каждой экспортируемой функции, вы можете использовать автоматизированные инструменты для извлечения сигнатур функций, типов, описаний параметров и даже определений перечислений непосредственно из вашего исходного кода C++.
Преимущества автоматической генерации
- Не требуется ручное написание JSON: Сигнатуры функций автоматически извлекаются из вашего кода
- Полная информация о типах: Структуры перечислений и typedef функций включаются автоматически
- Интеграция документации: Комментарии Doxygen парсятся и включаются в манифест
- Меньше ошибок: Устраняются опечатки и несоответствия типов между кодом и манифестом
- Простое обслуживание: Изменения в сигнатурах функций автоматически отражаются
Настройка: Добавление генерации документации в CMake
Добавьте следующее в ваш CMakeLists.txt для генерации документации и JSON-манифеста:
Использование парсера
Установка парсера
Скачайте parser.py и поместите его в ваш проект (например, в директорию tools/).
Установите зависимости:
Документируйте ваши функции
Добавьте комментарии Doxygen к вашим экспортируемым функциям:
Документируйте перечисления и typedef
Документируйте ваши перечисления и typedef функций:
Генерация документации
Соберите цель документации:
Это генерирует docs/index.yaml со всей информацией о ваших функциях.
Преобразование в JSON
Запустите парсер для преобразования YAML в формат манифеста:
Или с фильтрацией:
Использование в манифесте
Скопируйте сгенерированный массив methods из exported_methods.json в манифест вашего плагина:
Продвинутое: Структуры перечислений
Парсер автоматически включает полные определения перечислений, когда параметр использует тип перечисления:
Сгенерированный вывод:
Продвинутое: Typedef функций
Typedef указателей на функции автоматически парсятся в полные прототипы:
Сгенерированный вывод:
Примечание: Имена параметров typedef функций генерируются автоматически как param1, param2 и т.д. Вы можете захотеть настроить их в манифесте для лучшей документации.
Рекомендации
- Используйте
PLUGIN_API: Всегда используйте макросPLUGIN_APIдля пометки функций для экспорта. - Следуйте соглашениям о типах: Придерживайтесь соглашений о типах Plugify для параметров и возвращаемых значений.
- Документируйте ваши функции: Четко документируйте назначение, параметры и возвращаемые значения экспортируемых функций.
- Тщательно тестируйте: Тестируйте ваши экспортированные функции, чтобы убедиться, что они работают как ожидалось при вызове из других плагинов.
- Обновляйте манифест: Всегда описывайте экспортированные функции в манифесте плагина в разделе
methods.
Заключение
Экспорт функций в плагинах на C++ прост, если вы следуете соглашениям и лучшим практикам Plugify. Используя макрос PLUGIN_API, придерживаясь соглашений о типах и описывая функции в манифесте плагина, вы можете создавать надежные и совместимые плагины. Для более сложных сценариев использования, таких как обработка обратных вызовов или возврат объектов C++, используйте методы, изложенные в этом руководстве.