问题

我有两个编译器在我的硬件C++和C89上

我在考虑将C++与类一起使用,但不使用多态性(以避免vtable). 我想使用C++的主要原因是:

  • 我更喜欢使用"内联"函数而不是宏定义.
  • 我想使用名称空间,因为我的前缀使代码变得杂乱无章.
  • 我认为C++的类型更安全一些,主要是因为模板和冗长的强制转换.
  • 我非常喜欢重载函数和构造函数(用于自动强制转换).

在为非常有限的硬件(4KB的RAM)进行开发时,您认为有什么理由坚持使用C89吗?

结论

谢谢你的回答,他们真的很有帮助!

我把这个问题想透了,我将继续用C语言,主要是因为:

  1. 用C语言预测实际代码更容易,如果只有4kb的ram,这一点非常重要.
  2. 我的团队主要由C开发人员开发,所以高级C++特性不会经常使用.
  3. 我在我的C编译器(C89)中找到了一种内联函数的方法.

很难接受一个答案,因为你提供了这么多好的答案.

推荐答案

在C++之上使用C的两个原因:

  1. 对于许多嵌入式处理器,要么没有C++编译器,要么必须额外付费.
  2. 我的经验是,嵌入式软件工程师的一个重要比例几乎没有或没有C++的经验——因为(1),或者因为它往往不会在Electron 工程学位上被教——所以最好坚持他们所知道的.

另外,最初的问题和一些 comments 提到了4KB的RAM.对于一个典型的嵌入式处理器,RAM的数量(大部分)与代码大小无关,因为代码存储在闪存中并从闪存中运行.

当然,代码存储空间的大小是需要记住的,但是随着新的、更大的处理器出现在市场上,除了最具成本敏感性的项目之外,它不再是一个问题了.

关于在嵌入式系统中使用C++的一个子集:现在有一个MISRA C++标准,这可能值得一看.

EDIT:也见this question,这引起了关于嵌入式系统C和VC++的争论.

C++相关问答推荐

C sscanf没有捕获第二个参数

C中空终止符后面的数字?

与unions 的未定义行为

在#include中使用C宏变量

变量>;-1如何在C中准确求值?

如何在C宏中确定 struct 中元素的类型?

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

struct 上的OpenMP缩减

进程已完成,退出代码为138 Clion

如何在ASM中访问C struct 成员

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

为什么指针运算会产生错误的结果?

将回调/基于事件的C API转换为非回调API

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

使用Open62541向OPCUA服务器发送读请求时内存泄漏

正在try 理解C++中的`正在释放的指针未被分配‘错误

C struct 中的冒泡排序

模仿 memmove 的行为

使用替代日历打印日期

如何确定 C 程序中的可用堆内存