C和C++混合编程

本文探讨了C与C++混编时可能遇到的问题及解决办法,包括预编译设置、符号链接失败处理和静态库/动态库的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    有时要实现某些功能,会摘取部分别人成熟的代码,当代码量比较大时,难于避免C和C++代码混合编程的问题,下面是一些注意点。

 

1、预编译问题

     针对VC,有预编译的概念,如果Import进来的C文件没有使用预编译,可以单独把此C文件的预编译特性关掉。右键此C文件,Setting->C/C++,在Category中选“Precompiled Headers”,单选“Not using precompiled headers”可。

 

2、找不到符号的问题

     由于C++添加了重载等机制,会对函数进行自动改名,导致链接时找不到符号。遇到此问题时请在相关函数中使用extern "C" {}括起来即可。

     如一个经典的情况是:某个CPP文件中要使用某个由C实现的函数,首先在CPP中include此函数的声明:#include "XX.h",而此函数的实现是在"XX.C"文件中。结果CPP编译时,默认是会对函数重命名处理的,而C文件编译时,默认没有函数重命名处理,导致链接时找不到符号。此时可以这样包含XX.h文件:

extern "C" {

#include "XX.h"

}

 

      另外,也要注意C++的static关键字和inline特性,inline特性有时会引起Debug能链接过,但Release链接不过的问题,因为Debug是不作优化的,所有函数都没有实际inline,而Release会按编译器的优化策略对部分函数inline处理。如果遇到此种情况,也可以单独对指定CPP文件设置非inline特性。

 

3、静态库/动态库的问题

     只要用的编译器一致,C++和C互相链接不存在静态库问题,动态库就更不用说了,因为动态库是系统提供的特性。但是如果编译不一样的话,会有些问题,应避免使用,如VC6和VC2005。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值