混合使用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编译时该符号未定义,因此通常可以定义如下形式的头文件:

#ifndef __cplusplus

extern "C"

    {

#endif // __cplusplus

void func1();

void func2();

#ifndef __cpluscplus

} // extern "C"

#endif // __cpluscplus

上述代码确保C和C++程序员都可以正确使用func1()和func2()。

时间: 2024-10-10 22:18:04

混合使用C和C++的相关文章

MATLAB与Word、Excel的混合使用

华夫人:我们Notebook是由MathWork公司在MATLAB5.0中开始增加,实现MATLAB和Word的连接. 唐伯虎:哼!我们ExcelLink是在Windows环境下实现的Excel与Matlab连接. 华夫人:用了我们Notebook的人能在Word环境中“随心所欲的享用”MATLAB的浩瀚科技资源,感受到文字处理.科学计算.工程设计于一体的完美环境. 唐伯虎:没有错!而用了我们ExcelLink的朋友,在工作表空间和宏编程工具中使用Matlab的数值计算,图形处理等功能时,根本不

关于swift与objective-c混合使用

在xocde6出来我们大部分代码都是用objective-c写的(部分C/C++),现在出生来了一个新的语言叫swift,那么如何既能使用我们之前的代码,还可以使用新语言呢, 本文就此做一下说明. 关于swift语方的学习可以看文档 The Swift Programming Language 本文假设你已经有所了解,下面基于当前您当前在做的objective-c来做swift扩展, 假设我们想要用swift在原来的工程中做一个新的view界面, 这个view会用到原有的objective-c中

混合使用TFVC和GIT配置库的优化方案

如果要选出最近几年在软件工程领域最热的技术,那毋庸置疑就是git了.作为分布式源代码管理(DVCS)的代表,git以其超快的操作,便捷的分支合并模型和P2P模式的代码分享模式让软件开发团队的很多复杂协作成为可能,也大大提高了开发团队的效率.虽然如此,集中式的源代码管理(CVCS)仍然在很多大型软件团队中使用,这其中自然有历史原因,但集中式源代码控制所具备的很多特性也是分布式所不具备的,比如:代码资产的安全性,细化到文件级别的权限管理能力(使用某些插件或者hook,git也可以做到,但这不是git

Android RadioButton与ListView的混合使用

许久没有写过博客了,近来在做Android开发,突然想到这里,以后可以在这里贴些代码,做些记录,与大家分享交流.Android开发中,常常会用到RadioButton与ListView的混合使用,用户点击一条Item,然后记录下选中的状态,其中最重要的是记录好用户点击选中Item的位置. 布局文件很简单: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools

startService与bindService混合使用对Service生命周期的影响

FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/45314925,未经本人同意请勿用于商业用途,感谢支持! 项目开发中有遇到startService与bindService混合使用的情况,发现其对Service生命周期有很大影响,故与各位分享一下... 一.正常情况(应该大家都很熟了,简单介绍): (1)单独使用startService(): onCreate()->onStartCommand()->S

进击的UI-------------多种Cell混合使用&amp;懒加载&amp;自适应高度

1.自定义控件 2.model 3.多种cell混合使用 4自适应高度 5.懒加载

关于hibernate混合使用占位符和命名参数

早期hibernate不支持jdbc风格的占位符和命名参数两种方式混合使用 但是新版本的hibernate是可以支持的, @Test    public void testMixParameterMethod() {        //String hqlString ="from Org org where org.address = ? and org.code = ? ";        //String hqlString ="from Org org where o

iOS开发--混编篇&amp;swift与OC混合使用

Swift与OC混合使用 swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. 先中简单的入手,先研究在同一个工程目录下混合使用的情况. 为了演示.先准备两个类 第一个是swift语言写的类,文件名为 act.swift [cpp] view plaincopy import Foundation class Act : NSObject { fun

NGUI中Button与原生2D精灵的混合使用

一些废话 每一篇的首段都是这个“一些废话”,原因是我太能逼逼了,不逼逼一些废话我就觉得难受.这是我第四篇关于Unity的博文,前两篇还是去年写的,“从一点儿不会开始”系列,类似教程和学习笔记的博文,这个系列还会继续的,我没有太监...如果真的有朋友觉得能因此得到一点点的帮助,那就太太开心了. 最近在(shan)做(zhai)一个小游戏,UI刚开始用的是原生2D,用着用着发现NGUI似乎更省事儿(“为什么刚开始你不用NGUI?”“我擦我刚开始那会儿还不会好么...”),然后之前原生2D写的又不想完

wpf窗口中的资源的混合使用---WPF

WPF可以在窗体内定义resources,其中可以写一些模板什么的.也可以在里面直接引用其他资源字典文件.就像下面这样. <ResourceDictionary > <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source= "/MEFA.Procedure.WatchProcedure;component/LocalControls/SelectPerson.xaml" />