- 浏览: 1482674 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
参考
http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html
http://tzc.is-programmer.com/posts/551.html
前阵子被问及一个在C中如何调用C++函数的问题,当时简单回答是将函数用extern "C"声明,当被问及如何将类内成员函数声明时,一时语塞,后来网上查了下,网上有一翻译C++之父的文章可以作为解答,遂拿来Mark一下。
将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:
然后,你可以这样使用 f():
当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(wrapper)。例如:
然后,你就可以这样调用 C::f():
如果你想在 C 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:
然后,你可以这样使用每个重载的 f():
注意,这些技巧也适用于在 C 里调用 C++ 类库,即使你不能(或者不想)修改 C++ 头文件。
该翻译的文档Bjarne Stroustrup的原文链接地址是
http://www.research.att.com/~bs/bs_faq2.html#callCpp
http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html
http://tzc.is-programmer.com/posts/551.html
前阵子被问及一个在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
发表评论
-
weak_ptr解决循环引用问题
2021-03-08 21:12 1194C++11引入的三种智能指 ... -
gcc链接顺序
2019-10-12 18:25 658代码在 https://github.com/killinux ... -
xl2tp 备份
2019-09-24 16:25 7332019年9月24日更新: 注意,需要开启firewall ... -
c++11的function和bind
2019-09-10 16:12 538参考:https://www.cnblogs.co ... -
sdl笔记
2019-01-31 17:19 741sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1441参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 19022019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1409### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 601###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 659《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1963参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 961/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 648找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1807上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 1007不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4384假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 661864位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1756转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1630接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1550qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ...
相关推荐
总之,C语言调用C++类的方法涉及到C++的extern "C"声明、函数指针的使用以及正确的编译和链接步骤。理解这些细节对于进行跨语言编程至关重要。通过实践和调试,你可以更熟练地掌握这一技巧,从而在实际项目中灵活...
首先,我们来看C语言调用C++函数的情况。由于C++是C的超集,大部分C代码可以在C++环境中编译运行,因此C调用C++的函数相对直接。但是,C++引入了名字修饰(Name Mangling)机制,这使得C++的函数在链接时的名称可能...
在编程世界里,C语言和C++是两种广泛使用的编程语言,它们各有特色,但有时候我们需要在C语言的代码中调用C++编写的函数,特别是在大型项目中,可能既有历史遗留的C代码,又有使用C++新开发的部分。本文将深入探讨...
"C调用C++库"是一个常见需求,这通常涉及到C++的封装和接口设计,使得C代码能够安全、高效地调用C++的功能。下面将详细探讨这一主题。 首先,C++库为了被C语言调用,必须遵循C语言的 ABI(应用程序二进制接口)规则...
标题"“c语言调用C++类.zip xcode编译器”"暗示了这个压缩包包含了一个示例,演示如何在Xcode中使用C语言调用C++类。下面将详细解释这一过程: 首先,为了在C语言中调用C++类,我们需要遵循以下步骤: 1. **C++类...
4. 另外,可能还包含了C语言调用C++函数的示例,比如定义一个C++类,然后在C代码中创建该类的实例并调用其方法。 学习和理解这些源码,有助于提升对跨语言调用的理解,以及如何利用REFPROP库进行流体性质计算的能力...
标签中的"调用REFPROP C++"再次强调了C++调用REFPROP库的主题,"C调用REFPROP"则意味着同样提供了C语言的调用方式。这通常涉及到使用C语言的函数指针或者C++的extern "C"语法,以确保C++编译器不会对函数进行名字...
本示例将讲解如何在C语言(c language)中调用C++编写的函数,通过一个名为"main.c"的C源文件调用"hello.cpp"中的C++代码。这个过程在Ubuntu 18.04操作系统上进行,并使用CMake作为构建工具。 首先,我们来理解C与...
以下是一个关于"Objective-C调用C++"的知识点详解。 1. **Objective-C与C++的兼容性**: Objective-C是C语言的超集,因此它完全兼容C语言,并且可以方便地集成C++代码。这意味着Objective-C可以直接包含C++的类和...
C#与C调用C++,非托管,含struct调用及enum公用,完整项目,可直接编译或运行。 项目将所有工程的输出统一到Debug。 vs2015+Framework4.6,注意工程的配置。 所有东西自写,只是出于样例参考的作用,所以代码规范...
如何用c语言调用c++做成的动态链接库.docx
还在为在开发C代码是不能很好的重构与继承而烦恼吗?该例子实现C 语言调用C++
有时,我们可能需要在一个C编写的项目中使用C++库或者在C++项目中调用C函数,这就是所谓的“C调用C++”或“C++调用C”。下面将详细解释这个主题,以及如何实现这种跨语言的互操作性。 **1. C++的extern "C"声明** ...
标题中的"C调用C++函数"是指在C语言的程序中使用C++编写的函数或类的方法。在C++中,由于有名字修饰(Name Mangling),C语言无法直接识别C++的函数,因此需要一些特殊的处理来实现跨语言调用。本教程以VS2013作为...
本项目提供了一个示例,演示如何在C程序中调用C++类,同时利用CMake进行编译管理。下面我们将详细探讨这个过程中的关键知识点。 首先,我们要理解C和C++之间的兼容性问题。C++是C的超集,大部分C代码可以直接在C++...
本案例中,我们探讨的是"C调用C++dll测试",这是一个关于在C语言程序中如何利用C++编写的动态链接库(DLL)的技术。C++ DLLs提供了一种方式来封装代码并使其在多个应用程序中复用,而C语言作为广泛使用的编程语言,...
通过在C++中使用`extern "C"`关键字,我们可以避免名称修饰带来的兼容性困扰,使得C语言可以正确识别和调用C++函数。 总结来说,C调用C++函数的关键在于创建DLL,正确导入和导出函数,以及处理好名称修饰问题。而在...
### c#调用c++ dll 传参 string 崩溃的一种解决办法 在跨语言编程环境中,我们经常需要在不同编程语言之间进行交互。一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,...
有时我们需要在C#应用中调用C++DLL来利用这些功能。本篇文章将深入探讨如何在C#中调用一个C++DLL,特别是当DLL函数参数中包含指针时的处理方法。 首先,理解C#与C++之间的互操作性是关键。.NET框架提供了一个名为P/...