网站首页 > 技术文章 正文
在嵌入式软件程序开发中,C语言无疑是最常被使用的程序语言。不过应该明白的是,有些嵌入式硬件同时提供C语言程序编译器以及C++程序编译器,而相比于C语言,C++的确具备很多非常好用的特性。
C++更好用?
小明是一名嵌入式软件工程师,他擅长C语言和C++编程,现在需要在一款提供C++和C89编译器的4KB RAM 硬件设备上进行程序开发,他觉得C++有下面这些好用的特性:
- C++支持inline函数,它比define宏定义安全许多。
- C++支持命名空间(namespaces)。
- C++因为有模板和很多类型转换,因此类型安全性比C语言好。
- C++支持函数重载。
小明还有理由坚持只使用C89进行程序开发吗?
讨论
对于资源有限,比如RAM只有4KB的设备,我通常在正式开发C语言程序之前,会先写一些样例试水。天下没有免费的午餐,C++的一些好用特性其实是以牺牲性能为代价换来的,例如RTTI,动态类型转换,多重继承,多态以及异常处理都会带来一定的运行时开销。
另外,在嵌入式环境中,通常需要在硬件设备可以正常使用之前对其初始化,如果没有操作系统或者引导加载程序,这些初始化工作需要由程序员编写的程序完成。
应该明白的是,C++程序中的全局对象的构造函数是在 main() 之前运行的,因此在某些情况下,程序员将不得不修改本地的CRT0.S,以便在调用全局构造函数之前完成硬件的初始化。
因此,如果希望使用C++方便的进行嵌入式程序开发,最好限制使用C++的一些开销较大的高级特效。但是使用C++进行C语言风格的程序开发,倒不如直接使用C语言了。
此外,使用C语言进行嵌入式程序开发更容易把控最终生成的指令,能够得到更精确的硬件控制,这对于资源匮乏的嵌入式设备来说是非常可贵的。尤其在RAM只有4KB的设备上开发程序,使用C++要小心很多细节,反而没有使用C语言方便了。
还有种情况需要考虑,就是很多嵌入式设备并不提供C++编译器,因此虽说大多数优秀的C语言程序员使用C++没有什么问题,但是相比较而言,他们(包括我)更了解C语言,知道每一行代码究竟会做哪些工作,以及开销如何,这对于开发使用更小开销实现更大效率的程序很有帮助。
C语言语法比C++语法简单的多,也正因为如此,甚至很多程序员认为C语言是低级语言。正如前面所讨论的,C语言的每一行代码的意义都很明确,这使得C语言程序员把自己的精力主要花费在在硬件和构建良好的的和数据结构以及算法上,而复杂的C++则会让程序员花费大量时间挠头,想知道里面发生了什么,以及为什么不能在特定的环境和背景下做一些完全合理的事情,而只能服从编译器。
简单来说,C语言程序更加可控,而嵌入式程序员一般都是控制欲很强的性格,从这一层面考虑,C语言也更加适合嵌入式程序开发。
小结
简单来看,在嵌入式程序开发领域,C语言比C++更加合适主要有两个原因:
1. C语言程序更好预测其代码尺寸和开销,这对于RAM只有4KB的资源匮乏的嵌入式设备来说来很重要。
2. 大多数嵌入式程序员更了解C语言,因此为了促进同事间的协调性,更推荐使用大家都喜爱的程序语言。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
猜你喜欢
- 2025-07-02 C语言?c++?到底先学哪个才能更好的理解编程,这些你造吗
- 2025-07-02 C 语言和 C++ 有什么区别?老程序员居然这样理解,不怕你不懂
- 2025-07-02 Rust 比 C 更快吗?(rust与c的性能)
- 2025-07-02 C++ 与 C 的那些事儿:深度剖析两者区别
- 2025-07-02 C++到底有多难?难在哪里?(c++ 难度知乎)
- 2025-07-02 为什么大家都觉得学C/C++编程难?(为什么说c++难学)
- 2024-08-02 为什么C++这么难?从要学习的东西看,不看技术细节就已经很难
- 2024-08-02 为什么C++不是最好的入门语言?(为什么c++难学)
- 2024-08-02 学习编程丨为什么C++是最难学的编程语言?看大神怎么分析
- 2024-08-02 C++是不是最难学的编程语言?如果我想自学C++,真的能够学会吗?
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)