extern
和__declspec(dllimport)
之间有什么区别/关系?我发现有时需要两者都使用,有时一个就足够了。
我说得对吗:
extern
用于静态链接库,__declspec(dllimport)
用于DLL(动态链接库),extern
表示实体具有外部链接,即在其翻译单元(C 或 CPP 文件)外部可见。这意味着相应的符号将被放置在目标文件中,因此如果该目标文件成为静态库的一部分,它也将是可见的。然而,extern
本身并不意味着一旦目标文件成为 DLL 的一部分,该符号也将可见。
__declspec(dllexport)
表示该符号应从 DLL 导出(如果它确实是 DLL 的一部分)。它在编译进入 DLL 的代码时使用。
__declspec(dllimport)
表示将从 DLL 导入符号。在编译使用 DLL 的代码时使用它。
由于在编译 DLL 本身以及将使用 DLL 的客户端代码时通常使用相同的头文件,因此通常定义一个宏,在编译 DLL 时解析为
__declspec(dllexport)
,在编译时解析为 __declspec(dllimport)
它的客户端,就像这样:
#if COMPILING_THE_DLL
#define DLLEXTERN __declspec(dllexport)
#else
#define DLLEXTERN __declspec(dllimport)
#endif
回答您的具体问题:
extern
就足够了。extern
(请参阅此处的解释)。extern
的 __declspec(dllimport)
(请参阅上面链接的说明),但由于您通常会使用相同的头文件,因此您已经在其中有了 extern
,因为它是编译DLL时需要。