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

相关推荐
PAK向日葵2 小时前
我用 C++ 写了一个轻量级 Python 虚拟机,刚刚开源
c++·python·开源
玖釉-2 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
枕星而眠3 小时前
数据结构八大排序详解(一):四大简单排序
c语言·数据结构·c++·后端
努力努力再努力wz3 小时前
【Qt入门系列】:按钮组件全解析:从 QAbstractButton 到快捷键事件、单选与复选机制
c语言·开发语言·数据结构·c++·git·qt·github
skywalk81634 小时前
言知(Yanzhi)系统提升建议报告和完工报告 by AutoCoder
开发语言·编程
yunn_4 小时前
单例模式两种实现方法
开发语言·c++·单例模式
我材不敲代码4 小时前
Python基础:列表详解、增删改查及常用高阶操作
开发语言·windows·python
AI玫瑰助手4 小时前
Python运算符:成员运算符(in/not in)的使用场景
开发语言·python·信息可视化
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第77题】【Mysql篇】第7题:回表查询与全表扫描的区别?
java·开发语言·数据库·mysql·面试
水木流年追梦5 小时前
大模型入门-大模型分布式训练2
开发语言·分布式·python·算法·正则表达式·prompt