混合使用C和C++
C++作为C语言的扩展集,几乎所有的C程序都可以在C++中编译和运行,但是要注意C程序中可能使用了C++中的关键字作为变量,比如在C中:int class = 0; 但这在C++中不行。出于方便性,我们可以在类中(C++)调用函数(C),也可以在函数(C)中使用对象(C++)。
混合C和C++时,可能会丢失面向对象的特性,比如在C++编写的程序中使用了C的函数库,此时可以对C的函数进行重新封装为一个易用的类,一般可以将C函数的返回值作为类的一个成员。
C++通过name mangling支持函数重载,但是C语言不支持,其将重载看作重定义。默认情况下,C++编译器会对每一个函数执行name mangling,即生成比较奇怪的函数名,但是如果此时需要链接一个C语言函数库,那么C++编译器由于找不到这些奇怪的名字,而宣告编译失败。因此,必须显式告诉C++编译器,此函数使用某种语言规范命名,通过使用extern ”language”说明,其语法为:
extern “language” void func1();
extern “language” void func2();
或者:
extern “language”{
void func1();
void func2();
}
如:
extern “C” void func(int i); /* 表明func(int i)是一个外部的C函数,告诉C++编译器,该代码是用C语言编写的 */
使用extern的情况通常是在头文件中,比如现在想使用一个C语言编写的函数库,这个函数库可能有一个.h文件,此时我们可以编写一个新的头文件.hpp,将原来的头文件放在extern模块中,表示该头文件中定义的函数都是用C语言编写的:
// new_head.hpp
extern “C”
{
#include “old_head.h”
}
还有,我们可以通过条件编译选择到底使用C模块还是C++模块:C++编译时会定义一个符号__cplusplus,而C编译时该符号未定义,因此通常可以定义如下形式的头文件:
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
void func1();
void func2();
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
上述代码确保C和C++程序员都可以正确使用func1()和func2()。
混合使用C和C++的更多相关文章
- 混合使用UITabBarController和UINavigationController
混合使用这两个控件的好处是我们可以在NavigationBar添加更多的东西,如标题,按钮等.让用户能够获得更多的信息. UITabBarController的属性ViewControllers接受以 ...
- C#中的using和yield return混合使用
最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...
- 混合使用TFVC和GIT配置库的优化方案
如果要选出最近几年在软件工程领域最热的技术,那毋庸置疑就是git了.作为分布式源代码管理(DVCS)的代表,git以其超快的操作,便捷的分支合并模型和P2P模式的代码分享模式让软件开发团队的很多复杂协 ...
- IOS Storyboard使用-模拟登录、注册、混合使用
最近分析IOS的占有率,发现5.0以下的少之又少了,故而决定新的App用 Storyboard开发,找了很多资料都是点上的,这个简单的demo是测试代码,发上来,供新手参考. 模拟登录.注册.和显示主 ...
- 【HTML/XML 11】XML和HTML的混合使用
导读:在前面介绍了很多关于XML和HTML的东西,他们其实各有各的好处,在很多时候都需要结合起来使用.现在已经有XML和HTML结合的产物:XHTML(可扩展超文本标记语言).在本篇博客中,则主要介绍 ...
- 【Android 界面效果34】Android里Service的bindService()和startService()混合使用深入分析
.先讲讲怎么使用bindService()绑定服务 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回 ...
- iOS开发--混编篇&swift与OC混合使用
Swift与OC混合使用 swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编. ...
- WPF内嵌代码和后台代码简单混合使用
下面实例展示了WPF内嵌代码和后台代码混合使用,一个简单基础的实例: xaml文件: <Window x:Class="WPF内嵌代码和后台代码混合使用.MainWindow" ...
- Tab Bar Controller和Navigation Controller混合使用详细教程
在IPHONE上,NAV和TAB混合使用的案例很多.但很多书籍都没详细介绍这个是怎么使用的.我也找了很久才弄清楚怎么做.现在分享给大家. 1.先建立一个Window-based Application ...
- IOS开发之UITabBarController与UINavigationController混合使用
ios开发中UITabBarController与UINavigationController混合使用是很多app的基础页面结构,下面是简单的的页面初始化的方法,在AppDelegate.m的 - ( ...
随机推荐
- css遇到的问题
1.屏幕三部分自适应居中?(js没奏效) 2.背景透明内容也透明?
- C++ Builder技巧集锦
/* 调用DOS程序时不显示窗口 使 用 ShellExecute调 用 DOS程 序 时 可 以 不 显 示 窗 口 , 如 :*/ ShellExecute(, "open", ...
- 常用的MyEclipse快捷键
在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当需要恢复代码功能的时候,又可以用Ctrl+/ 去掉注释.这 ...
- 利用Python抓取CSDN博客
这两天发现了一篇好文章,陈皓写的makefile的教程,具体地址在这里<跟我一起写makefile> 这篇文章一共分成了14个部分,我看东西又习惯在kindle上面看,感觉一篇一篇地复制成 ...
- dedecms后台上传图片附件返回302的问题
在网上查了资料,验证可行后,在这儿做个备份! 自己解决了,貌似是swfupload在linux环境下session丢失的引起的 解决办法是:在include/userlogin.class.php文件 ...
- [leetcode]_Merge Two Sorted Lists
题目:合并两个有序单链表 思路:一开始想复杂了,以为必须在原链表上修改(绕来绕去还AC了,但是思路相当绕),其实没有,按照正常地合并两个数组同样的方法也对. 代码: public ListNode m ...
- 一个特别不错的jQuery快捷键插件:js-hotkeys
这其实不是什么新技术,这个插件在很早前就已经发布了,之前有项目用到,所以分享出来添加方式的例子 jQuery.hotkeys.add('esc',function (){ //执行函数 }); jQu ...
- php中intval()函数
格式:int intval(mixed $var [, int $base]); 1.intval()的返回值是整型,1或者0.可作用于数组或者对象(对象报错信息:Notice: Object of ...
- 【php学习之路】字符串操作
无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...
- WinSock编程基础
一.套接字模式 1.阻塞模式 创建套接字时,默认是阻塞模式,对recv函数调用会使程序进入等待状态,知道接收到数据才返回. 2.非阻塞模式: 可以调用ioctlsocke ...