如果DLL是提供给VC++用户使用的,你只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport)声明的函数会对函数名尾附加函数在DLL中的地址。

extern "C" __declspec(dllexport)是什么意思

__declspec(dllexport)  __declspec(dllimport)一般也是使用宏的形式:

extern "C" __declspec(dllexport)是什么意思#ifdef ONEDLL_EXPORTS
extern "C" __declspec(dllexport)是什么意思#define ONEDLL_API __declspec(dllexport)
extern "C" __declspec(dllexport)是什么意思#else
extern "C" __declspec(dllexport)是什么意思#define ONEDLL_API __declspec(dllimport)
extern "C" __declspec(dllexport)是什么意思#endif

这样在DLL代码本身就是__declspec(dllexport) ,在使用DLL的程序中就变成了__declspec(dllimport),这两标志分别用来指明当前的函数将被导出,和当前函数是被导入的。

如果调用模块和被调用模块都是C++(而且是同一种编成环境,如VC,甚至需要同一版本的VC),那么就不需要extern “C”了,因为这个标志的作用就是用在函数和变量声明前,无论是调用模块,还是被调用模块,都将生成C修饰符,调用模块将需要C修饰符的函数,而被调用模块将产生C修饰符的函数,所以这个标志在两者都是C++的时候使用并不受影响,不使用这个标志,也不受影响。
但是如果C模块要调用C++ 模块,那么C++模块就需要使用extern “C”,当然C不用

参考:

https://www.cnblogs.com/zhehan54/p/5919983.html

https://blog.csdn.net/u013399150/article/details/72123977?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

 

相关文章: