为何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
相关产品推荐
相关产品推荐

