__declspec(dllexport)

__declspec(dllexport) 属性は、DLL ライブラリのビルド時に、ダイナミックシンボルテーブルからシンボルの定義をエクスポートします。クラスに適用した場合、vtablesconstruction vtable、RTTI など、クラスの付帯変数の可視性を制御し、メンバ関数およびスタティックデータメンバのデフォルトの可視性を設定します。

Show/hide使用法

__declspec(dllexport) は、関数、クラス、またはクラスの個々のメンバに使用できます。

インライン関数が __declspec(dllexport) としてマークされると、関数定義はインライン展開される場合がありますが、インライン関数以外の関数と同様に、関数のアウトオブラインインスタンスが常に生成され、エクスポートされます。

class __declspec(dllexport) S { ... }; のように、クラスが __declspec(dllexport) としてマークされると、そのスタティックデータメンバおよびメンバ関数がすべてエクスポートされます。個々のスタティックデータメンバおよびメンバ関数を __declspec(dllexport) でマークした場合、対応するメンバのみがエクスポートされます。vtable、construction vtable テーブル、および RTTI もエクスポートの対象となります

Note

以下の宣言は正しい例です。

class __declspec(dllexport) S { ...};

以下の宣言は誤った例です。

__declspec(dllexport) class S { ...};

--export_all_vtbl との組み合わせで __declspec(notshared) を使用することによって、クラスまたは構造体のエクスポートから vtable、construction vtable テーブル、および RTTI を除外することができます。通常、--export_all_vtbl__declspec(dllexport) を組み合わせて使用することはしません。

Show/hide制約条件

クラスを __declspec(dllexport) でマークした場合、そのクラスの個々のメンバを __declspec(dllexport) でマークすることはできません。

クラスを __declspec(dllexport) でマークする場合は、そのクラスのすべての基本クラスが __declspec(dllexport) でマークされている必要があります。

クラス内の仮想関数をエクスポートする場合、そのクラスのすべての仮想関数をエクスポートするか、または、クライアントから見えるようにそらの仮想関数をインラインで定義する必要があります。

Show/hide

宣言に必要な __declspec() は、その定義が同じ共有ライブラリに存在するかどうかによって異なります。

/* 同じ共有ライブラリで定義する場合の宣言 */
 
__declspec(dllexport) extern int mymod_get_version(void);

/* 定義を含んだ変換単位 */
__declspec(dllexport) extern int mymod_get_version(void)
{
   return 42;
}

/* 宣言の定義が共有ライブラリに含まれない場合 */
 
__declspec(dllimport) extern int mymod_get_version(void);

以下のマクロによって、定義を含んだリンクユニット内の、定義を含まない変換単位から、__declspec(dllexport) が見えるようになります。

/* mymod.h - モジュールへのインタフェース */
#ifdef BUILDING_MYMOD
#define MYMOD_API __declspec(dllexport)
#else /* BUILDING_MYMOD ではない*/
#define MYMOD_API __declspec(dllimport)
#endif

MYMOD_API int mymod_get_version(void);

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711