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"对函数进行兼容处理。

相关推荐
秃头佛爷6 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨7 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode