加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++和C API调用

发布时间:2020-12-16 07:18:43 所属栏目:百科 来源:网络整理
导读:c++是C的超集,不可避免的要兼容C的特性,C++在C基础山的拓展部分叫做C?with?class,同时C++有自己特有的属性比如模板template. C并不完全是C++的子集. 那么如何在C/C++中设计接口,实现相互调用呢?我们经常在C++代码中看见extern C的语句,那么其目的是什么

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++中exposed?interface?as C?style API,也就是如何暴露C API给外部client使用,假设C?client需要调用C++的函数,那么我们通过引入extern C告诉C++编译器按C?规则编译函数代码,也就是不name?mangling.?否则符号表会找不到对应的符号。因为C中函数修饰名就是函数名,如果用C++编译,会有name?mangling,那么linker?会找不到对应的实现.无法连接.
  • 如何在C++调用C代码,还是引入extern C,告诉C++编译器函数用C的方式去链接。?以上的区别是一个是complie?function?as C?api?和?linker?function?as C?api.

在实现中我们可以看见:C++调用C函数?注意ifdef -cplusplus的用法。如果是C++那么就用C形式linker,此时外部llibrary就是C库..?

?

//C_library.h

#ifdef __cplusplus
extern "C" { #endif // // ... prototypes for C_library go here ... // #ifdef __cplusplus } #endif
//
// 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垮掉。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读