C 和 C++ 区别

一、理论

语言定位

C:面向过程语言,关注怎么做,侧重流程、函数、内存操作,没有类、对象、继承等面向对象特性。

C++:在C基础上扩展,支持面向过程 + 面向对象 + 泛型编程,兼容大部分C语法。

核心差异:C是过程驱动;C++支持面向对象封装、继承、多态。

核心特性差异

输入输出:C用printf/scanf;C++推荐cout/cin,也兼容C IO。

结构体:C的struct只有成员变量;C++的struct可以写成员函数,等同于class(默认public)。

函数:C不支持函数重载、默认参数;C++支持重载、默认参数、引用。

内存管理:C用malloc/free;C++新增new/delete,会自动调用构造/析构函数。

命名空间:C没有namespace;C++有namespace,解决命名冲突。

异常:C没有标准异常机制;C++支持try-catch-throw。

编译层面

C:.c文件,编译器gcc,编译为C风格目标代码。

C++:.cpp文件,编译器g++;C++名字会名字修饰(name mangling),支持重载,C函数不会修饰,所以C++调用C库需要extern "C"。

二、代码示例

示例1:结构体对比

// C代码 struct

struct ImageInfo{

int width;

int height;

};

// C不能在struct内部写函数

// C++ struct

struct ImageInfo{

int width;

int height;

// C++结构体可以包含成员函数

void setSize(int w, int h){

width = w;

height = h;

}

};

示例2:内存分配对比

// C

struct ImageInfo* img = (struct ImageInfo*)malloc(sizeof(struct ImageInfo));

free(img);

// C++

ImageInfo* img = new ImageInfo();

delete img;

示例3:extern "C" (影像开发高频)

#ifdef __cplusplus

extern "C" {

#endif

// 这段函数编译成C风格符号,C++代码可以直接给C层调用

void setSensorExposure(int exp);

#ifdef __cplusplus

}

#endif

三、手机影像算法集成 实际工作场景

你做Camera HAL / 影像算法集成时,这个知识点非常常用:

Camera HAL 框架底层大量代码是 C语言,Android原生BSP、驱动接口都是C,追求精简、可控内存,没有RTTI、异常这些额外开销。

上层算法模块、算法封装、算法管理类一般用 C++:

用类封装 Sensor、ISP、CaptureSession,把曝光、白平衡、降噪算法封装成对象,代码更容易维护。

使用命名空间隔离不同厂商算法模块,避免函数名冲突。

函数重载:比如重载setParam,支持传入int、结构体等不同参数。

跨层交互痛点:HAL的C接口 和 C++算法模块互相调用,必须用extern "C",否则C++名字修饰会导致找不到符号,so库加载失败,影像进程crash。

选型取舍:

底层硬件交互、性能极致要求:优先C,二进制体积小,无额外开销。

算法业务逻辑、多模块管理:C++,面向对象便于维护复杂影像管线。

面试高频坑:C++兼容C,但不是完全兼容;C没有引用、类;malloc不会调用构造函数,new会。

✅ 面试口述精简版

C是面向过程语言,适合底层驱动、HAL这类轻量代码;C++基于C扩展,支持面向对象、泛型编程,增加类、引用、重载、new/delete、namespace。

C没有名字修饰,C++存在名字修饰,C++调用C库要用extern "C"。

在手机影像开发中,Camera HAL底层多为C,上层算法模块常用C++,两者经常混编,重点要处理好跨语言符号兼容问题。

相关推荐
汉克老师1 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
晴天的雨.9922 小时前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven2 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_406981032 小时前
c++ lamda(三)Lambda表达式
java·前端·c++
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla14 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu20 小时前
一个通用游戏数据服务器
c++·架构
another heaven20 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论