混合使用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的 - ( ...
随机推荐
- WebApi简单使用
一.建立一个WebApi项目 WebApi项目的文件和MVC的基本项目内容差不多,都有Models View Controller等,区别在于WebApi的控制器继承的不是Controller类,而是 ...
- MongoDB 1: NoSQL 和 SQL的区别
导读:本篇博客,主要是结合自己在项目中的使用,简单的阐述一下NoSQL和SQL的区别.那么,根据自己的应用,NoSQL这边,选择的是MongoDB(Redis虽然也是,但属于内存存储,这里不予说明). ...
- ajax 跳入error的一些原因
先放一个标准的jquery的ajax代码: $.ajax({ type: 'POST', url: 'getSecondClassification', data: {"sort2" ...
- dell n2000 组播抑制
http://en.community.dell.com/support-forums/network-switches/f/866/t/19677497 http://en.community.de ...
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...
- rel="stylesheet" 描述
<link type="text/css" rel="stylesheet" href="css/style.css"/> re ...
- .NET 命名规范 代码示例
class Person { /// <summary> /// 公有字段.属性 首字母大写 /// </summary> public string FirstName; p ...
- view上添加点手势 button无法响应点击事件
在view 上添加手势 有的时候 会把Button的 点击事件盖掉,这个 时候 我们用UITapGestureRecognizer的代理方法 //手势的代理方法 - (BOOL)gestureRec ...
- 必须会的SQL语句(三)插入
1.规范一些使用插入语句的小规范 1)中文字符串前 最好 加一个N 2)列名用中括号 扩起来 像这样 [列名] 2.常规写法 Insert into tableName ( [col ...
- bea weblogic workshop中文乱码
重装系统后,weblogic 8.1 workshop中的中文字体是乱码. 可通过菜单中的 Tools -> IDE Properties -> Display, 在Window font ...