1、解决的问题:
考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?
2、解决办法:
使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值
#ifndef DLL_H_
#define DLL_H_
#ifdef DLLProvider
#define DLL_EXPORT_IMPORT __declspec(dllexport)
#else
#define DLL_EXPORT_IMPORT __declspec(dllimport)
#endif
DLL_EXPORT_IMPORT int add(int ,int);
#endif
其实不用dllimport也是可以正常工作的,之所以用这个,是因为对于引用该头文件的外部模块来说这个标记对编译优化有作用。
__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。
__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等