dll编写为什么加上 extern "C" 和 __stdcall /__cdecl
来源:互联网 发布:喜夜网络娴主播 编辑:程序博客网 时间:2024/06/05 04:23
- C方式编译(extern "C"):
- __stdcall调用约定:输出名称在原名称前加一下划线,后面再加上一个“@”和其参数的总字节数(_原名称@参数总字节数),如名称int Func_C_stdcall(int a,int b)输出为_Func_C_stdcall@8;
- __cdecl调用约定:与原名称相同,如名称int Func_C_cdecl(int a,int b)输出还是为Func_C_cdecl;
- C++方式编译(extern "C++"):
- __stdcall调用约定:
- 输出名称以“?”开始,后跟原名称;
- 原名称后再跟“@@YG”,后面再跟返回值代号和参数表代号,代号表示如下:
X--void ,
D--char,
E--unsigned char,
F--short,
H--int,
I--unsigned int,
J--long,
K--unsigned long,
M--float,
N--double,
_N--bool,
...
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复; - 参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。如名称int Func_CPP_stdcall(int a,int b)编译后的输出名称为?Func_CPP_stdcall@@YGHHH@Z。
- __cdecl调用约定:与_stdcall调用约定基本一致,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。如名称int Func_CPP_cdecl(int a,int b)编译后输出名称为?Func_CPP_cdecl@@YAHHH@Z。
- __stdcall调用约定:
有个这个规则,再回头去看我们的实验结果,就很好理解了。
当然,编译C文件和编译CPP文件,不需加extern "C"和extern "C++",因为编译C文件当然默认的是extern "C",而编译CPP文件则默认的是extern "C++"。
现在我们也能理解为什么导出DLL时通常需要加上extern "C"。试想,如果一个C++导出的dll,没有加extern "C",则导出的名称为extern "C++"约定下的名称。如果这个dll需要提供给用C编写的程序使用,那么这个程序是无法调用这个dll的,因为C写的程序遵循的是extern "C"约定,链接时链接器将按照extern "C"约定的名称去寻找外部名称,这当然找不到,因为dll中的输出名称为extern "C++"约定下的名称。
0 0
- dll编写为什么加上 extern "C" 和 __stdcall /__cdecl
- 编写和使用DLL时,常用的关键字 extern "C",__declspec,__cdecl,__stdcall
- DLL编写中extern “C”和__stdcall的作用
- DLL编写中extern “C”和__stdcall的作用
- DLL编写中extern “C”和__stdcall的作用
- 总结&备忘:__stdcall,__cdecl,extern "C"
- extern "C" DLL_EXPORT __cdecl与__stdcall
- 调用约定(__stdcall and __cdecl)和修饰名(extern c)
- __stdcall,__cdecl,_cdecl,_stdcall,__fastcall,_fastcall 区别简介 和 extern "C" 的作用
- C/C++中函数的调用约定(__cdecl, __stdcall)以及extern, extern “C"的详细解释
- extern, extern "C",__stdcall
- DLL中调用约定和名称修饰(__cdecl,__stdcall,__fastcall)
- DLL中调用约定和名称修饰(__cdecl,__stdcall,__fastcall)
- __cdecl,__stdcall和__fastcall
- __cdecl和__stdcall
- __stdcall和__cdecl
- __stdcall和__cdecl
- 关于__stdcall和__cdecl
- 【codeforces 749B】Parallelogram is Back
- Android控件布局属性全纪录
- arm-none-eabi-g++ -Xlinker -T "../LF3Kmonitor.ld" -Xlinker -Map="Bogota_ICT_V.map"-ram-hosted.ld -mc
- ECMAScript6(ES6)标准之对象Object扩展方法及新特性
- caffe 学习资源
- dll编写为什么加上 extern "C" 和 __stdcall /__cdecl
- CentOS7使用firewalld打开关闭防火墙与端口
- Swift提示框
- Windows下关于稀疏编码建模工具箱SPAMS的配置
- 安卓布局中layout_gravity和gravity的区别
- DOM事件
- [乐意黎转载]PHP mysql_fetch_object() 函数
- 算法---选择排序
- 大数据时代,连犯罪都能预测?