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++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
(Charon)1 小时前
【C++面试】设计模式:手写单例模式与工厂模式
开发语言·c++
无名猿1 小时前
shared_ptr 的线程安全边界:计数安全不等于对象安全
c++·内存管理·并发编程·现代c++
根目录下的猫1 小时前
ROS 2 C++(rclcpp)版本,实现话题订阅、话题发布,以及完整编译运行流程
开发语言·c++·算法
无名猿1 小时前
shared_mutex 读写锁该不该用,以及 volatile 的三大误解
c++·性能优化·并发编程·现代c++
大侠归来3 小时前
C 语言 | 在函数中操作数组
c语言·c++·算法
朝朝辞暮i9 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
郑同学的笔记10 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
随意起个昵称11 小时前
【背包dp】输出方案路径
c++·动态规划