C语言调用C++函数

2023-11-17

前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。

 

将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

     // ...

}

 

然后,你可以这样使用 f():

/* C code: */

void f(int);

void cc(int i)

{

    f(i);

   /* ... */

    }

 

当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:

// C++ code:

class C

{

       // ...

       virtual double f(int);

};

 

extern "C" double call_C_f(C* p, int i) // wrapper function

{

       return p->f(i);

}

 

然后,你就可以这样调用 C::f():

/* C code: */

double call_C_f(struct C* p, int i);

 

void ccc(struct C* p, int i)

{

       double d = call_C_f(p,i);

       /* ... */

}

 

如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:

// C++ code:

void f(int);

void f(double);

 

extern "C" void f_i(int i) { f(i); }

extern "C" void f_d(double d) { f(d); }

 

然后,你可以这样使用每个重载的 f():

/* C code: */

void f_i(int);

void f_d(double);

 

void cccc(int i,double d)

{

       f_i(i);

       f_d(d);

       /* ... */

}

注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。

 该翻译的文档Bjarne Stroustrup的原文链接地址是

http://www.research.att.com/~bs/bs_faq2.html#callCpp 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言调用C++函数 的相关文章

随机推荐

  • 关于rocketmq 中日志文件路径的配置

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 rocketmq 中的数据和日志文件默认都是存储在user home路径下面的 往往我们都需要修改这些路径到指定文件夹以便管理 服务端日志 网
  • ML-朴素贝叶斯

    参考 西瓜书 P151 以前对贝叶斯参数的计算过程不是很清楚 在西瓜书里讲的很详细 原来可以把X属性分为离散型与连续型 离散型的话可以直接按照频率计算 连续型的话 要用极大似然估计 首先假设概率密度函数满足一个分布 比如正态分布 然后利用已
  • 动态控制ToolStrip上ToolStripButton的大小(包括图标的大小)

    一 设置固定大小的ToolStripButton 设置固定大小的ToolStripButton很简单 ToolStripButton gt AutoSize属性设置为false size调整为自己想要的大小即可 同时配合的是ToolStri
  • Flutter与android原生通信

    Flutter 与 Android iOS 之间信息交互通过 Platform Channel 进行桥接 Flutter 定义了三种不同的 Channel 但无论是传递方法还是传递事件 其本质上都是数据的传递 MethodChannel 用
  • 因Redis分布式锁造成的P0级重大事故,整个项目组被扣了绩效......,请慎用

    作者 浪漫先生 出处 juejin im post 5f159cd8f265da22e425f71d 背景 我们项目中的抢购订单采用的是分布式锁来解决的 有一次 运营做了一个飞天茅台的抢购活动 库存 100 瓶 但是却超卖了 要知道 这个地
  • 在C++11通过SFINAE机制实现静态检查类成员是否存在并分情况处理,以及一种通用宏的实现

    目录 引入 目的 代码 测试 TIPS 引入 c 模板中 我们无法知道参数类是否具有某个成员 例如下面代码 我们希望下面的代码中能够打印t的成员变量a的值 然而当类型T不包含成员a时 调用下面的代码就会报错 template
  • iOS Push详述,了解一下?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由WeTest质量开放平台团队发表于云 社区专栏 作者 陈裕发 腾讯系统测试工程师 商业转载请联系腾讯WeTest获得授权 非商业转载请注明出处 原文链接 http wetest
  • 安装eli5库的踩雷

    报错方法 在Anaconda Prompt中输入pip install eli5 conda install eli5指令 分别显示安装失败和未找到包 解决方法 在Anaconda Powershell Prompt中输入conda ins
  • 深度学习中的优化算法之RMSProp

    之前在https blog csdn net fengbingchun article details 124766283 中介绍过深度学习中的优化算法AdaGrad 这里介绍下深度学习的另一种优化算法RMSProp RMSProp全称为R
  • 【从0学习Solidity】2. 值类型详解

    Solidity极简入门 2 值类型 博主简介 不写代码没饭吃 一名全栈领域的创作者 专注于研究互联网产品的解决方案和技术 熟悉云原生 微服务架构 分享一些项目实战经验以及前沿技术的见解 关注我们的主页 探索全栈开发 期待与您一起在移动开发
  • el-date-picker默认展示最近七天以及设置可选日期选择最大跨度

    el date picker组件内容
  • uniapp 自定义手机顶部状态栏不生效问题

    想要的效果想淘宝一样 底色覆盖到手机顶部 找了两天都没找到原因 过程很艰苦 直接上结果吧 项目是后来接手的 最终原因出在这 immersed false gt 设置为 true 就可以了 沉浸式样式
  • Linux 内核开发学习

    Linux 内核 Linux 内核官网 传送门 Linux 内核源码下载 传送门 1 内核空间 现在来说一下内核空间以及用户空间 这是学习linux内核最基本的两个概念了 如果连这都不懂 那就好好学吧 我们先从这张图入手 32位操作系统的最
  • 华为OD机试 - 增强的strstr(Python)

    题目描述 C 语言有一个库函数 char strstr const char haystack const char needle 实现在字符串 haystack 中查找第一次出现字符串 needle 的位置 如果未找到则返回 null 现
  • 锐星服务器怎么上传文件,协议转换器仪表远程配置方法专利_专利申请于2019-06-06_专利查询 - 天眼查...

    1 一种协议转换器仪表远程配置方法 其特征在于 包括以下步骤 步骤1 在平台端开发一个基于页面配置的配置程序 为指定的CAN仪表协议提供配置工具 输出配置文件 该配置文件是由版本信息 报文CAN ID配置语句 车载机使用数据项ID配置语句
  • 【干货】--手把手教你完成文本情感分类

    作者 刘顺祥 个人微信公众号 每天进步一点点2015 前言 2017年12月9日 参加了天善组织的线下沙龙活动 在沙龙中自己分享了如何借助于R语言完成情感分析的案例 考虑的其他网友没能够参与到活动现场 这里通过微信公众号作一个简单的分享 在
  • 【Angular中的HTTP请求】- JSONP 详解

    JSONP JSON with Padding 是JSON的一种 使用模式 可用于解决主流浏览器的跨域数据访问的问题 基于XMLHttpRequest的数据请求会受到同源策略限制 而 JSONP 以
  • 为什么离不开 Stackoverflow

    作为一名程序员 如果没有听过 Stackoverflow 那么你最好去面壁思过一下 程序员最需要阅读的一本编程书籍 其实编程书留下这本就够了 那些还没有读过这本书的程序员 是时候买一本了 如果还在犹豫 那么先看下这篇文章 看看为什么离不开
  • linux创建链接命令

    1 软链接 符号链接 1 软链接文件有类似于Windows的快捷方式 2 在符号连接中 文件实际上是一个文本文件 其中包含的有另一文件的位置信息 3 它只会在你选定的位置上生成一个文件的镜像 不会占用磁盘空间 linux创建链接软命令 具体
  • C语言调用C++函数

    前阵子被问及一个在C中如何调用C 函数的问题 当时简单回答是将函数用extern C 声明 当被问及如何将类内成员函数声明时 一时语塞 后来网上查了下 网上有一翻译C 之父的文章可以作为解答 遂拿来Mark一下 将 C 函数声明为 exte