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. LeetCode 802. Find Eventual Safe States

    原题链接在这里:https://leetcode.com/problems/find-eventual-safe-states/ 题目: In a directed graph, we start a ...

  2. Oracle iops测试

    DECLARE  lat  INTEGER;  iops INTEGER;  mbps INTEGER;BEGIN  DBMS_RESOURCE_MANAGER.CALIBRATE_IO(4, 10, ...

  3. learning scala akka actorySystem create and close

    package com.example import akka.actor.ActorSystem import scala.util.{Failure, Success} import scala. ...

  4. terraform v0.12.0 发布了

    v0.12.0 相比以前的有好多新的特性,包括语法,以及函数增强,昨天还在折腾的一个json解码的问题,直接使用 v0.12.0 就可以解决了,同时也包含了for 操作处理同时官方文档对于v0.12. ...

  5. HTML相对路径和绝对路径

     一.相对路径 相对路径不带有盘符,通常是以HTML网页文件为起点,通过层级关系描述目标图像的位置. 相对于文件自身出发,就是相对路径. 主要有以下几种情况:   ①文件和图片(html文档)在同一个 ...

  6. uni-app input text-indent失效解决

    有两种方法去解决 第一种 input { padding-left: 10upt } 第二种 input { display: block }

  7. 设计模式——<面向对象设计原则以及23种设计模式分类>

    一.面向对象八大设计原则: 1.依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) . 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽 ...

  8. Koa 脚手架创建项目

    Koa 脚手架创建项目 通过应用 koa 脚手架生成工具 可以快速创建一个基于 koa2 的应用的骨架 全局安装koa npm install koa-generator -g //必须安装到全局 创 ...

  9. mysql union all limit的使用

    To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enc ...

  10. 014 ThreadLocal详解

    一:ThreadLocal的原理 1.说明 ThreadLocal从字面意思来理解,是一个线程本地变量,也可以叫线程本地变量存储.有时候一个对象的变量会被多个线程所访问,这个时候就会有线程安全问题,当 ...