Макросы _API используются для предоставления классов и функций другим модулям.
Самый простой способ думать об этих спецификаторах - это то, что они используются для обозначения функций, классов или данных как общедоступных для вашего модуля.DLL файл.Если вы помечаете функцию в модуле Engine как ENGINE_API, то любой модуль, который импортирует Engine, может напрямую обращаться к этой функции.
Они используются только при компиляции модуля в модульном режиме (файлы DLL на настольных платформах).Противоположным является то, что мы называем монолитным режимом, который объединяет весь код в один исполняемый файл.Тип сборки определяется параметрами и / или платформами UnrealBuildTool и конфигурацией сборки.
Фактический макрос API соответствует одному из следующих в зависимости от того, как код компилируется UBT:
__declspec( dllexport )
, при компиляции кода модуля в модульном режиме.
__declspec( dllimport )
, при включении общедоступных заголовков модуля для импортируемого вами модуля.
пусто при компиляции в монолитном режиме
Макросы API имеют смысл только для модулей, которые статически импортируются из другого модуля.Модуль Core является отличным примером - почти каждый второй модуль в UE4 указывает Core как зависимость импорта в своем файле * .Build.cs.
Многие модули никогда не нужно импортировать статически (например, модуль SceneOutliner.)Мы называем эти модули динамически загружаемыми модулями.Динамически загружаемые модули являются замечательными, потому что они могут быть обнаружены при запуске (вроде плагина), и часто могут быть перезагружены на лету.
Макросы API в основном используются в старом коде, чтобы позволить более новым модулям получить доступэто из их DLL.В более новых фрагментах кода макросы API используются гораздо реже, вместо этого настраивая приятные слои интерфейса для предоставления функциональности через границы DLL.