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++中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垮掉。
C++和C API调用的更多相关文章
- Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用.这个应用始终遗留了一个问题,Web App在访问REST AP ...
- 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
信鸽推送 .NET 服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...
- xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)
xmlrpc实现bugzilla4 xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...
- FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误
前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...
- Sphinx中文分词安装配置及API调用
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...
- (36)老版和新版API调用
---------更新时间18:06 2016-09-18 星期日------- *前言 我用的是odoo8,但里面有相当多的api是以前版本,这时若我们自己开发的 插件采用新版本api,里面 ...
- Sphinx中文分词详细安装配置及API调用实战
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...
- 控制ASP.NET Web API 调用频率与限流
ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...
- jquery api调用
本框架内置组件以及部分插件都可以通过jquery选择器进行API调用,支持链式操作,如下示例. <script type="text/javascript"> $(&q ...
- Android微信SDK API 调用教程1
最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...
随机推荐
- C++中的hash_map和map的区别
hash_map和map的区别在哪里?构造函数.hash_map需要hash函数,等于函数:map只需要比较函数(小于函数). 存储结构.hash_map采用hash表存储,map一般采用红黑树(RB ...
- window对象方法(alert-confirm-prompt)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [Flutter + Firebase] Enable Firebase for Flutter
Anroid Firebase Project setup: 1. In firebase console, cerate a Android app setup you can find in co ...
- 001_keil仿真
(一)参考文献:STM32F4 MDK5软件仿真 error : no 'read' permission (二)转载: 问题描述 CPU:STM32F407MDK5软件模拟提示没有读写权限,只能一 ...
- 检验多个xsd的xml是否合法
Java - 使用 XSD 校验 XML https://www.cnblogs.com/huey/p/4600817.html 这种方法不支持多个xsd文件,会报错 可以使用XMLBeans Too ...
- THUPC&CTS 2019 游记
day ? 去THU报了个到. day? THUPC比赛日,三个人都没有智商,各种签到题不会做,被各路神仙吊着打.G题还猜了个假结论,做了好久都不对.最后顺利打铁了. 还顺便去看一下THUAC. da ...
- 【JOISC2019|2019】【20190622】cake3
题目 \(N\) 个物品中选\(M\)个,排列成一个环:\(k_1,\cdots,k_M\)价值为: \[ \sum_{j=1}^{N}{V_i} - \sum_{j=1}^{M}|C_{k_j}- ...
- httpd.exe你的电脑中缺失msvcr110.dll怎么办(WIN2008服务器环境装WAMP2.5出现的问题)
httpd.exe你的电脑中缺失msvcr110.dll怎么办 去微软官方下载相应的文件 1 打开上面说的网址 Download and install, if you not have it alr ...
- 测试linux下磁盘的读写速率
1) 通过df -h命令查看磁盘情况 Filesystem Size Used Avail Use% Mounted on/dev/sda4 289G ...
- Linux环境下Nexus3.6安装
1. 安装JDK 2. 下载nexus开源版本即可,Nexus OSS下载 流程 3. 解压文件,会的得到两个文件夹[nexus-3.6.0]和[sonatype-work] tar -zxv ...