こうした指定子について最も簡単な考え方は、モジュールのダイナミック リンクライブラリ (Dynamic Link Library、DLL) ファイルに「パブリック」として関数、クラス、データをタグ付けするために使用されるということです。Engine モジュールでENGINE_API として関数をマークすると、Engine をインポートするどのモジュールでもその関数に直接アクセスすることができます。
これらは、エンジンをモジュール モードでコンパイルする場合のみ使用されます (DLL ファイルがデスクトップのプラットフォーム上にある)。この逆としては、「モノリシック」モードがあります。これは、すべてのコードをひとつの実行ファイルにまとめます。ビルドのタイプは、UnrealBuildTool の設定と (または) プラットフォーム、およびビルド設定によって制御されます。
実際の API マクロは、コードがUBT によってどのようにコンパイルされるかによって以下のいずれかと等しくなります。
- モジュール モードでモジュール コードをコンパイルする場合は __declspec( dllexport )。
- インポートするモジュールにパブリック モジュールのヘッダを含む場合は __declspec( dllimport )。
- 「モノリシック」モードでコンパイルする場合は空。
他のモジュールから静的にインポートしたモジュールに対してのみ API マクロは意味があります。Core モジュールは良い例です。UE4 の他のほとんどすべてのモジュールが、*.Build.cs ファイルでのインポート依存関係として Core を指定します。
モジュールの多くは、静的にインポートする必要はありません (SceneOutliner モジュールなど)。こうしたモジュールは、動的にロードされたモジュールといいます。動的にロードされたモジュールは非常に素晴らしいものです。スタートアップ時に (プラグインのように) 見つけることができ、多くの場合、ただちに再ロードできるからです。
API マクロは古いコードでほとんど使用され、新しいモジュールがその DLL からアクセスできるようにします。新しいコードでは、API マクロの使用ははるかに少なく、かわりに DLLの境界を超えて機能を公開する優れたインターフェイス レイヤーをセットアップします。