定义和声明(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

,而 dllimport 表示一个声明中,使用 dllexport 表示一个定义。 您必须使用 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.
}

请参见

参考

dllexport, dllimport