C++ extern "C" __declspec(dllexport) __declspec(dllinport) 修饰符分析

1.extern "C" 修饰函数生成C的符号。
     我在下面分析下为什么要用extern "C"。
     大家都知道C++是支持函数重载的,所以C++在生成函数的符号表时是把参数类型带上的。
例如:
     void test (int a , int b );
     生成的符号是
      void __cdecl test (int ,int )

     extern "C" test(int a, int b);      
     生成的符号是
      _test
     看出不同了吧,C++把参数类型也加入符号了,这也是为什么C++只有参数不同才能重载了而返回值不行。
所以调用C写的库函数要extern "C"让编译器知道这是C的函数,从而才能匹配到符号。
     常见的做法就是在引用一个C写的库的头文件时 extern "C" 包含它。
     extern "C"
     {
     #include "XX.h"
     }
     BTW:extern "C" 是C++中才有的,c编译器会报错。

2. __declspec(dllexport) __declspec(dllinport)
     这是 VC自定的关键字,用在生成动态库的时候。
     dll中用__declspec(dllexport)把符号导出
     程序中用 __declspec(dllinport)把符号导入
     使用 __declspec(dllinport)声明的函数编译器查找的符号为_imp_XXX,所以把动态库改成静态库时则
必须得把这些去掉,否则会发生无法引用符号的错误。
     BTW:linux中生成动态库并不需要这么麻烦。






你可能感兴趣的:(C++)