C++和 C 混合编程处理

原因是因为有很多功能是用 C 语言开发的,而 C++是兼容 C 的,C++应该能直接使用这些功能,那么我们把 C++调用 C 实现的功能的这个做法,称为混合编程
但是用 C 开发的功能,很可能已经用 C 编译器编程成目标文件(或打包成库了),那么目标文件中的函数名已经确定下来了,C++去调用函数时,会进行换名处理,将导致,在目标文件中找不到对应的函数
为什么 C++会去改变函数名呢,因为 c++支持函数重载,只要参数不同,返回值不同函数名可以相同,因为 c++会将函数的名字根据返回值以及参数重新生成一个名字,验证的话可以使用-c 编译一个.o 文件,然后用 nm 命令去查看里面的内容,例如:

那么怎么解决 c++会对 c 函数进行换名处理而找不到定义呢?
在 C++中提供了一个关键字:extern "C",称为链接指示,即告诉 C++编译器,用 extern "C" 修饰的函数,是用 C 编译器编译的,当调用这个函数的时候,不要去修改它们的名字,大多数情况下,extern "C" 是写在头文件中的。但是因为 C 语言不认识这个关键字,所以在编译代码时,我们得区分编译器是 C 的编译器,还是 C++的编译器,C++编译器中预定义了一个宏,叫:_cplusplus,C 编译器没有定义这个宏,所以,我们可以根据这个宏来区分是哪个编译器在编译代码,例如:

cpp 复制代码
#ifdef _cplusplus
extern "C"
{
#endif
    int sum(int a, int b);
    double fun();
#ifdef _cplusplus 
}
#endif

可以看到,如果是 C++编译器,那么就会调用 extern "C"对函数进行兼容处理。

相关推荐
只因从未离去4 分钟前
黑马Java基础笔记-4
java·开发语言·笔记
言之。8 分钟前
【Go语言】ORM(对象关系映射)库
开发语言·后端·golang
newki10 分钟前
学习笔记,Linux虚拟机中C/C++的编译相关流程步骤
c语言·c++
席万里23 分钟前
Go语言企业级项目使用dlv调试
服务器·开发语言·golang
jerry60940 分钟前
c++流对象
开发语言·c++·算法
fmdpenny40 分钟前
用python写一个相机选型的简易程序
开发语言·python·数码相机
虾球xz1 小时前
游戏引擎学习第247天:简化DEBUG_VALUE
c++·学习·游戏引擎
海盗强1 小时前
Babel、core-js、Loader之间的关系和作用全解析
开发语言·前端·javascript
猿榜编程1 小时前
python基础-requests结合AI实现自动化数据抓取
开发语言·python·自动化
我最厉害。,。2 小时前
PHP 反序列化&原生类 TIPS&字符串逃逸&CVE 绕过漏洞&属性类型特征
android·开发语言·php