You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何cpp.hint文件同时包含__declspec(dllexport)与__declspec(dllimport)

为什么Visual Studio生成的DLL项目头文件同时包含dllexport和dllimport?

先看你提到的代码:

#define TEST_API __declspec(dllexport)
#define TEST_API __declspec(dllimport)

其实这两行不会同时生效,背后是预定义宏的条件编译逻辑(Visual Studio生成的完整代码会用#ifdef/#else/#endif包裹,可能你看到的是简化后的内容),完整结构类似:

#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

具体工作逻辑如下:

  • 编译DLL项目本身时,Visual Studio会自动添加一个和项目名关联的预定义宏(比如项目名为TEST,就会加TEST_EXPORTS)。此时TEST_EXPORTS被定义,第一行宏生效,TEST_API等价于__declspec(dllexport)——这个标记会告诉编译器,把带有TEST_API的函数、类等符号导出到最终生成的DLL文件中,供外部程序调用。
  • 当其他项目(比如调用DLL的EXE)包含这个头文件时,不会定义TEST_EXPORTS宏,此时#else分支生效,TEST_API变成__declspec(dllimport)——这个标记告诉编译器,这些符号是从外部DLL导入的,不需要自己定义,编译时会生成对应的导入表引用,链接阶段直接从DLL中获取符号。

这么做的核心目的是复用同一个头文件:不用为DLL导出和客户端导入分别编写两个头文件,既减少了重复代码,也避免了后续修改时两个文件不同步的问题。

内容的提问来源于stack exchange,提问作者aybe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:50:24