定義と宣言 (C++)
Microsoft 固有の仕様 →
DLL インターフェイスは、システム内のプログラムによってエクスポートされることがわかっているすべての項目 (関数とデータ)、つまり、dllimport または dllexport として宣言されたすべての項目を参照します。 DLL インターフェイスに含まれるすべての宣言では、dllimport か dllexport の属性を指定する必要があります。 ただし、定義では、dllexport 属性のみを指定する必要があります。 たとえば、次の関数定義はコンパイラ エラーになります。
__declspec( dllimport ) int func() { // Error; dllimport
// prohibited on definition.
return 1;
}
次のコードでも、エラーが生成します。
#define DllImport __declspec( dllimport )
__declspec( dllimport ) int i = 10; // Error; this is a
// definition.
ただし、次に示す構文は、正しい構文です。
__declspec( dllexport ) int i = 10; // Okay--export definition
dllexport の使用は定義を意味し、dllimport は宣言を意味します。 宣言を強制するには、dllexport と共に extern キーワードを使用する必要があります。このようにしない場合、暗黙の定義になります。 そのため、次の例は正しいコードになります。
#define DllImport __declspec( dllimport )
#define DllExport __declspec( dllexport )
extern DllImport int k; // These are both correct and imply a
DllImport int j; // declaration.
次の例に、上記の例をさらに明確に示します。
static __declspec( dllimport ) int l; // Error; not declared extern.
void func() {
static __declspec( dllimport ) int s; // Error; not declared
// extern.
__declspec( dllimport ) int m; // Okay; this is a
// declaration.
__declspec( dllexport ) int n; // Error; implies external
// definition in local scope.
extern __declspec( dllimport ) int i; // Okay; this is a
// declaration.
extern __declspec( dllexport ) int k; // Okay; extern implies
// declaration.
__declspec( dllexport ) int x = 5; // Error; implies external
// definition in local scope.
}