AVR-GCC 中的 C++ 标准合规性

C++ Standard compliance in AVR-GCC

提问人:Michael Francis 提问时间:4/29/2013 更新时间:11/11/2023 访问量:4049

问:

我正在学习对Arduino进行编程,但我在C++方面有相当扎实的背景,这意味着我非常失望地发现我无法使用C++标准库。我一直在四处寻找,试图找出确切的原因,到目前为止,唯一合理的解释是AVR-GCC不符合C++语言标准。

现在,我知道大多数编译器都与标准有细微的偏差,但我认为一定有一些非常大的东西将 AVR-GCC 与 GCC、Clang 或我以前使用过的任何其他编译器区分开来。比如一些完全缺失的非常重要的功能,或者其他什么。例如,我不能使用一定有充分的理由。它太有用了,不能无缘无故地离开。std::vector

那么它是什么?AVR-GCC方言中的巨大漏洞是什么,使C++标准库在Arduino上无法工作?我问这个问题不仅仅是出于好奇,因为如果语言中存在巨大的漏洞,那么我需要了解它们,然后才能做出一些我没想到的未定义的行为。

C++ Arduino AVR-GCC C++-标准库

评论

0赞 Alexander Shukaev 4/29/2013
这就是C++,它在嵌入式世界中具有所有不合规,不兼容和整体蹩脚的支持。我知道,这是非常不幸的。进入新世纪的13年,有时感觉我们仍然在90年代。
0赞 PlasmaHH 4/29/2013
在我看来,大多数嵌入式 c++ 平台都没有附带 stdlib,主要是因为无论如何没有人会真正使用它
1赞 Alexander Shukaev 4/29/2013
@PlasmaHH:部分原因,但这听起来更像是一个借口。
0赞 PlasmaHH 4/29/2013
@Haroogan:也许吧,但这是一个非常好的选择。如果没人会使用它,我不想编写和维护一个库。
1赞 Pete Becker 4/29/2013
@Fanael - 这就是静态链接的全部意义所在:链接器拉取实际使用的代码,而不是整个库。库本身的大小与可执行文件的大小无关。

答:

-3赞 MSalters 4/29/2013 #1

AVR-GCC显然是业余爱好者的作品。从本质上讲,没有人愿意承担编写标准库实现的艰苦工作。对于桌面平台来说,编写标准库并不是一件容易的事,而Arduino的有限功能只会让它变得更加困难。

评论

2赞 angelatlarge 4/30/2013
你能解释一下为什么是“业余爱好者”吗?PROGMEM
1赞 MSalters 4/30/2013
@angelatlarge:好的编译器不需要关键字。此外,好的编译器编写不会以“没有关于应该去哪里的硬性规定”结束。C 和 C++ 的语法可能会有一些歧义,但不是这种规模。语法不是模糊的。PROGMEM
3赞 angelatlarge 4/30/2013
我仍然对这种说法感到困惑:这是编译器设计不好的证据吗?怎么样?鉴于 AVR 是哈佛架构的处理器,RAM 非常少,但能够在 ROM 中存储数据(具有各种性能成本),我不确定我是否理解您关于硬性规则和模糊语法的观点。volatileregister
0赞 MSalters 4/30/2013
@angelatlarge:语法定义非常明确。当然,在很多地方它是合法的,它确实取决于你实际上声明的内容(例如,对于成员函数,它排在最后),但语法是由“硬性规则”定义的,不像 .是的,以今天的标准来看很糟糕(它被完全忽略了)。C++ 已经回收了它的表亲关键字 ,用于更有用的目的。volatilevolatilePROGMEMregisterauto
1赞 DarthRubik 6/5/2016
@MSalters 另一件需要注意的事情是 IAR 做同样的事情......你必须为此付出代价
0赞 David Hawley 11/11/2023 #2

我刚刚在结构中使用灵活的数组(可变大小的数组)时遇到了问题。没有编译器抱怨,但它就是不起作用。我不得不更改为使用指向在结构外部定义的数组的指针。