• 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垮掉。

  • 相关阅读:
    uni-app 调用支付宝支付
    PLSQL安装教程,无需oracle客户端(解决本地需要安装oracle客户端的烦恼)
    Java 基于WebMagic 开发的网络爬虫
    android 手机权限管理——PermissionsDispatcher
    Eclipse 上传 删除 下载 分析 hdfs 上的文件
    初见Hadoop—- 搭建MyEclipse 访问HDFS 上的文件
    仿简书登录框,可删除内容或显示密码框的内容
    setFeatureInt、android 自定义标题栏
    Translucent Bar Android状态栏自定义颜色
    仿QQ消息气泡提醒
  • 原文地址:https://www.cnblogs.com/kkshaq/p/11212961.html
Copyright © 2020-2023  润新知