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调用的更多相关文章

  1. Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

    概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用.这个应用始终遗留了一个问题,Web App在访问REST AP ...

  2. 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)

    信鸽推送 .NET  服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...

  3. xmlrpc实现bugzilla api调用(无会话保持功能,单一接口请求)

    xmlrpc实现bugzilla4   xmlrpc api调用(无会话保持功能,单一接口请求),如需会话保持,请参考我的另外一篇随笔(bugzilla4的xmlrpc接口api调用实现分享: xml ...

  4. FormatMessage与GetLastError配合使用,排查windows api调用过程中的错误

    前一段时间在学习windows api调用过程中,遇到过一些调用错误或者程序没能显示预期的结果,或者直接出现vc运行时错误. 这对新手来说是司空见惯的事,因为不太熟悉难免会出错,出错的信息如果能显示很 ...

  5. Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  6. (36)老版和新版API调用

    ---------更新时间18:06 2016-09-18 星期日------- *前言   我用的是odoo8,但里面有相当多的api是以前版本,这时若我们自己开发的   插件采用新版本api,里面 ...

  7. Sphinx中文分词详细安装配置及API调用实战

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  8. 控制ASP.NET Web API 调用频率与限流

    ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...

  9. jquery api调用

    本框架内置组件以及部分插件都可以通过jquery选择器进行API调用,支持链式操作,如下示例. <script type="text/javascript"> $(&q ...

  10. Android微信SDK API 调用教程1

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...

随机推荐

  1. MySQL之自连接

    自连接就是说,在同一个表中,看做是两个表,下表表示 找每个人的领导,如果没有领导,显示无领导,eid 对应 leaderid,请看员工表 mysql> select * from emp; +- ...

  2. Java静态static关键字

    static关键字既可以修饰成员变量,也可以修改成员方法,修饰的成员变量和成员方法可以直接通过类名调用,也可以通过对象调用(其实即使是通过对象调用,也会被翻译成类名调用),建议通过类名调用. 成员方法 ...

  3. ARDUNIO IMU processing姿态数据可视化

    https://www.arduino.cn/thread-42852-1-1.html 关键数据打包 float roll, pitch, heading; Serial.print("O ...

  4. LeetCode 873. Length of Longest Fibonacci Subsequence

    原题链接在这里:https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/ 题目: A sequence X_1, X ...

  5. circus 进程以及socket 管理工具&&docker运行

    circus 是由mozilla 团队开发基于python 以及zeromq 的进程以及socket 管理的工具,类似supervisord 但是比supervisord 更灵活方便 来自官方的使用比 ...

  6. 4、spark streaming+kafka

    一.Receiver模式 1. receiver模式原理图 在SparkStreaming程序运行起来后,Executor中会有receiver tasks接收kafka推送过来的数据.数据会被持久化 ...

  7. GoCN每日新闻(2019-10-18)

    GoCN每日新闻(2019-10-18) 在Go1.13使用Errors https://blog.golang.org/go1.13-errors Go的扁平化应用结构 https://www.ca ...

  8. HTML列表,表格与媒体元素

    一.列表  信息资源的一种展示形式   二.列表的分类  1.有序列表   <ol>    <li>列表项1</li>    <li>列表项2</ ...

  9. ICEM-三角形特征几何

    原视频下载地址:https://pan.baidu.com/s/1qY8SKri 密码: wf17

  10. ueditor div style被过滤 解决办法

    上周开发中有用到开源的富文本编辑器UEditor,在使用的过程中遇到了样式被过滤无法显示问题,经过一番折腾终解决,此外,还有一些关于获取前台界面元素的一些总结. 1. UEditor样式被过滤无法显示 ...