关于__declspec( dllexport )的疑问:类C是导出到DLL还是从DLL导出?
关于
__declspec(dllexport)的困惑解答 这个问题其实挺容易绕晕的,我给你直白地解释清楚:
当你在类C的定义前加上__declspec( dllexport )时,你是在把类C从当前编译的DLL文件中导出——换句话说,这段代码属于你正在开发的DLL项目,这个关键字是在告诉编译器:“把这个类C放进DLL里,让外部程序(比如调用这个DLL的EXE或者其他DLL)能访问到它”。
举个实际的例子,假设你正在写一个DLL项目,代码长这样:
__declspec( dllexport ) class C { public: void DoSomething(); // 其他成员定义 };
编译完成后,生成的DLL文件里就会包含类C的导出符号,外部项目只要链接对应的.lib文件,就能正常使用类C了。
这里再区分下两个容易混淆的场景:
- 作为DLL的编写者,用
dllexport:标记需要对外暴露的类/函数,把它们加入DLL的导出符号表。 - 作为DLL的使用者,用
__declspec(dllimport):告诉编译器“这个类/函数不是我本地实现的,是从外部DLL导入的”。
另外分享一个实用小技巧,大家通常会用宏来自动切换这两个关键字,避免重复写代码:
#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec( dllexport ) #else #define MYDLL_API __declspec( dllimport ) #endif MYDLL_API class C { // 类成员定义 };
编译DLL项目时,你只需要在项目设置里定义MYDLL_EXPORTS,宏就会自动变成dllexport;而在使用这个DLL的项目里,不用定义这个宏,宏就会变成dllimport,非常省心。
内容的提问来源于stack exchange,提问作者Edwin Paco
相关产品推荐
相关产品推荐

