C++和C API调用
c++是C的超集,不可避免的要兼容C的特性,C++在C基础山的拓展部分叫做C?with?class,同时C++有自己特有的属性比如模板template. C并不完全是C++的子集. 那么如何在C/C++中设计接口,实现相互调用呢?我们经常在C++代码中看见extern C的语句,那么其目的是什么呢? C/C++程序中的函数在链接阶段对应的符号标识称为修饰名,是由编译器按某种规则生成的一个字符串,在compiling阶段创建,linking阶段使用。它就象函数的身份证号,必须唯一,后续才能被正确索引。 C中不容许函数重载,也就是相同的函数名只能声明定义一个函数,而C++中函数重载是被容许的。int?func(int?a),int func(double a),C++中引入了name?mangling,在编译的时候,对于相同名字的func?会根据其参数和函数名生成一个unique的函数名。然后连接器linker就会连接到重载的函数中,
在实现中我们可以看见:C++调用C函数?注意ifdef -cplusplus的用法。如果是C++那么就用C形式linker,此时外部llibrary就是C库..? ? //C_library.h // // C_library.c // #include "C_library.h" // // ... implementations for C_library go here ... // // // C++_code.cpp // #include "C_library.h" #include "C++_code.h" // // ... C++_code implementation here may call C functions in C_library.c ... // C/C++混编已经介绍完,那么为什么平常我们的第三方库往往都是C API形式的呢?因为C++形式的ABI?二进制接口没有统一规范.?如果采用第三方库1.0之后,对方进行了升级到2.0,很有可能会造成库的二进制文件内存布局的变化,导致不兼容。不能只更新第三方库。还需要编译整个项目。生产环境很不推荐在dll里暴露C++接口,尤其是模板接口。因为除非所有的binary都在你的控制之下,否则他们一旦使用的编译器不同(版本不同也算),就极有可能内存miss match垮掉。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |