随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

【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语言可能无法理解。

 

 

posted on   Andy Niu  阅读(545)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示