【M34】如何在同一个程序中结合C++和C
1、C++和C混合编程的时候,需要考虑产生的目标文件的兼容性。
2、名称重整,为什么要搞出名称重整? 连接器要求所有方法名必须独一无二。对于C语言,没问题。C++支持过载,也就是方法名相同,形参表不同的方法,因此编译器编译的时候,必须对方法名重整,保证方法名独一无二,满足连接器的要求。那么问题来了,C++和C混合编程,编译时没有问题,连接时出现问题了,C++进行了名称重载,而C没有,连接时名称对不上了。
怎么解决这个问题?就是使用extern C,告诉编译器,不要进行名称重整。对于C++与C共用的头文件,C++必须使用extern C,而C语言不识别extern C,因此使用预编译。对于__cplusplus,使用externC,否则不使用extern C
3、statics的初始化,我们通常认为main方法是程序的入口点。实际上,在main方法执行之前要做一些准备工作,在main方法执行之后要做一些清除工作。
main方法之前:对于static对象,全局对象,命名空间和文件作用域的对象,执行构造方法,进行初始化。注意两点:第一,不同编译单元内的静态对象初始化顺序是不确定的。第二,对于局部static对象(方法内的对象),只有在方法被调用的时候初始化,而且是只有第一次调用的时候初始化,以后调用都不再初始化。
在main方法执行之后:要对上述的statics对象,执行析构方法。
可以这样认为,编译器在main方法中安插一些代码,如下:
int main(int argc,char* argv[])
{
performstaticInit();
....
performStaticDestruction();
}
需要注意的是,编译器在main方法中安插这些代码,这就要求必须要有C++ main方法。对于C语言负责启动程序的情况,也就是main方法在C语言中,该怎么办?
解决办法是:C语言main方法重命名为realMain方法,增加C++ main方法调用realMain。
4、内存分配。C语言使用malloc和free,C++使用new和delete。思考,有了malloc和free,为什么还需要new和delete?
malloc和free是C语言中的方法,只负责分配内存和释放内存。对于C++,我们期望在分配内存后调用构造方法,在调用析构方法后再释放内存。由于malloc和free是方法,不在编译器控制权限,因此增加了new和delete操作符,来实现上面的需求。注意,malloc必须和free匹配,new必须和delete匹配。
5、数据结构的兼容性。在C++和C语言之间传递数据,是可行的。但是,必须限制在二者的交集范围,由于C++是兼容C语言的,也就是限制在C语言的范围内。因此,不能将对象和成员方法传给C语言,另外,对于含有虚方法的类,会导致对象的内存布局发生变化,C语言可能无法理解。
【M34】如何在同一个程序中结合C++和C的更多相关文章
- zz剖析为什么在多核多线程程序中要慎用volatile关键字?
[摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持 ...
- sql数据查询,在程序中较慢,在MS SQL2005 Management Studio中速度快,情况分析及解决
这两天遇到一个问题,在.net开发的网站,执行sql查询,从sql profiler中监控卡看,执行时间22s. 但是拷出的sql在Management Studio中直接执行,时间仅4ms. 解决方 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...
- [转载]Java应用程序中的内存泄漏及内存管理
近期发现测试的项目中有JAVA内存泄露的现象.虽然JAVA有垃圾回收的机制,但是如果不及时释放引用就会发生内存泄露现象.在实际工作中我们使用Jprofiler调用java自带的 jmap来做检测还是很 ...
- 使用Ninject来解决程序中组件的耦合问题
1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名 ...
- 程序中的Cookie 和Session
这几天回家休息后,想想放假之前的几天,主要看的一些工作上的东西,发现对Session和Cookie这两个东西,我还是很陌生.恩,趁着有网,看了点相关的资料,打算整理下.一翻博客,发现已经有前辈已经对这 ...
- MVC程序中实体框架的连接恢复和命令拦截
MVC程序中实体框架的连接恢复和命令拦截 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(2)--SQL Server如何编译存储过程 在我们开始深入研究如何处理 ...
随机推荐
- 用Asp.net实现简单的文字水印
用Asp.net实现简单的文字水印 经常看见MOP上有人贴那种动态的图片,就是把一个字符串作为参数传给一个动态网页,就会生成一个带有这个字符串的图片,这个叫做文字水印.像什么原来的熊猫系列,还有后来 ...
- eclipse 报错汇总
1.Eclipse 启动时,报错: Fail to create the java virtual machine 已解决.方法:eclipse.ini 中-vmargs-Dosgi.requir ...
- 1005acm罚时
ACM国际大学生程序设计竞赛是由国际计算机学会主办的,一项旨在展示大学生创新能力.团队精神和在压力下编写程序.分析和解决问题能力的年度竞赛.参赛队伍最多由三名参赛队员组成,竞赛中一般命题10-13题, ...
- Kali vmtools
参考链接:http://www.leavesongs.com/SHARE/kali-vmtools-install.html 安装环境:kali-1.1.0 ---3.18.0-kali1-amd ...
- [转载]关于CSDN, cnblog, iteye和51cto四个博客网站的比较与分析
CSDN:http://blog.csdn.net/ cnblog: http://www.cnblogs.com/ iteye: http://www.iteye.com/blogs/ 51cto: ...
- 一个介绍webrtc的国外网址
http://www.html5rocks.com/en/tutorials/webrtc/basics/
- jquery对象和js对象,以及它们的互相转换
jq对象无法使用DOM对象的方法,互相都不能用 ***jq对象转换成DOM对象的2中方法 1.$('div')[0下标]:jq对象是类似数组对象有长度,所以可以通过下标查找到它的DOM对象 2.$(' ...
- ASP.NET自定义控件入门Demo
最近看了MSDN关于自定义控件的介绍,根据官方的文档,自己学着做了一个简单的Demo给需要的朋友参考. ASP.NET 源生的TextBox是不带Label标签的,这里我要实现的是创建一个带Label ...
- plutil工具
作用: 检查元素文件语法: 转换格式.支持xml binary json: 插入key-value: 打印内部信息: 详细解释: -lint check ...
- 在drupal7中动态的为某个内容类型添加字段
$myField_name = "my_new_field_name"; if(!field_info_field($myField_name)) // check if the ...