extern "C "只是表示这个可以被C语言调用,除了这个之外,没有什么更多含义。
因为C语言的编译器和C++的不同,C++的会有个叫做函数名打散的机制,比如函数:int add(int a,int b)在C++里面编译之后,就不是int add(int a,int b),而是类似:int add@WEROIUERH(int a,int b)的函数名,而且是随机的,如果不用extern "C ",C语言根本没法调用,而在C++里面可以通过@的顺序来调用。
__declspec (dllexport)输出函数的时候,用loadlibrary又有何不可?
关键是你要知道输出符号的名字。
因为c++中有函数重载,通过函数名并不能唯一确定一个函数,所以使用c++方式编译函数时系统会在目标码中的内部修饰符中加入参数信息和返回值信息等, 这时候你能估算出正确的名称吗?
如果加了extern "C "则是用c的方式编译,函数在目标码中的内部修饰符就是_函数名,只要用函数名就可以调用
由于C++里面有函数重载,所以在编译的时候,编译器会在你写的,也就是你希望导出的函数
后面加上一些关于参数的信息,也就是真正导出的函数名字和你想要的不一样。
又由于C语言没有函数重载,所以用EXTERN "C"的意思就是告诉编译器不要按照C++那样修改函数
名称。
建议用模块定义文件 .def文件来写DLL,这样可以保证导出函数的纯净。