一、理论
语言定位
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++,两者经常混编,重点要处理好跨语言符号兼容问题。