AVR-GCC中的C++标准兼容性

6
我正在学习编程Arduino,但我有很扎实的C++基础,所以当我发现无法使用C++标准库时,感到非常失望。我一直在寻找确切原因,目前唯一合理的解释是AVR-GCC不符合C++语言标准。
我知道大多数编译器与标准有轻微差异,但我认为AVR-GCC与GCC、Clang或其他我以前使用过的编译器之间必定存在某些巨大的差异,例如某些非常重要的特性完全缺失等。这也许就是为什么我无法使用std::vector等功能的原因。没有理由将其排除在外,因为它实在太有用了。
那么是什么原因导致AVR-GCC方言中存在如此巨大的空白,使得C++标准库在Arduino上无法使用呢?我问这个问题不仅仅出于好奇,因为如果语言中存在巨大的漏洞,那么在我进入某些未定义的行为之前,我需要了解它们。

据我所知,大多数嵌入式C++平台似乎都没有附带标准库,主要是因为实际上很少有人会使用它。 - undefined
1
@PlasmaHH: 在某种程度上,但那听起来更像是借口。 - undefined
@Haroogan:也许是这样,但这是一个非常好的库。如果没有人使用它,我就不想编写和维护它。 - undefined
大部分我认为这与可用的2KB RAM有关,不鼓励使用new/malloc,因为没有操作系统来跟踪内存,你很容易覆盖和破坏堆栈。标准库可能没有为这样的限制设计,因此不容易移植。嵌入式世界是一个非常不同的地方。 - undefined
1
@Fanael - 这就是静态链接的全部意思:链接器只会引入实际使用到的代码,而不是整个库。库本身的大小与可执行文件的大小无关。 - undefined
显示剩余4条评论
2个回答

0
我刚刚遇到了一个问题,尝试在结构体中使用一个可变大小的数组(灵活数组)。编译器没有报错,但是它就是不起作用。我不得不改用一个指向在结构体外定义的数组的指针。

-3

AVR-GCC 显然是业余爱好者的作品。基本上,没有人愿意承担起编写标准库实现的艰巨任务。对于桌面平台来说,编写标准库并不是一项简单的任务,而 Arduino 的有限能力只会让这变得更加困难。


2
你能解释一下为什么PROGMEM被称为“爱好者”吗? - undefined
1
@angelatlarge:好的编译器不需要关键字。此外,优秀的编译器编写者不会遇到“关于PROGMEM应该放在哪里没有硬性规定”的问题。C和C++的语法可能存在一些歧义,但并不到这种程度。语法绝对不是模糊的。 - undefined
3
我仍然对这个说法感到困惑:volatile之类的东西是不良编译器设计的证据吗?那么register呢?考虑到AVR是一种哈佛架构处理器,具有很少的RAM但能够将数据存储在ROM中(伴随着各种性能成本),我不确定我是否理解了你关于硬性规则和模糊语法的观点。 - undefined
@angelatlarge:volatile 的语法非常明确。当然,它在多个地方都是合法的,并且取决于你实际声明的内容(例如,对于成员函数,它应该放在最后),但是 volatile 的语法是由“硬性规则”定义的,不像 PROGMEM。而且,是的,根据今天的标准来看,register 是不好的(它被完全忽略了)。C++ 已经重新使用了它的近亲关键字 auto,用于更有用的目的。 - undefined
1
@MSalters 还有一件需要注意的事情是IAR也会做完全相同的事情...而且你还得为此付费。 - undefined
OP明确表达了一个非常不受欢迎但却是真实的观点,哈哈。开个玩笑,我不太理解业余爱好者部分,但我对于非运行时标准头文件在AVR GCC上至今仍无法正常工作感到非常沮丧。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接