【发布时间】:2023-03-30 15:48:01
【问题描述】:
从问题Writing firmware: assembly or high level?跟进this comment:
在为Arduino平台编译C++代码时,可以使用虚函数、异常等吗?或者您想(必须)使用 C++ 的一个子集(如the comment 中所述)?
为 Arduino 平台编程时还有其他注意事项吗?
【问题讨论】:
标签: c++ arduino virtual-functions firmware
从问题Writing firmware: assembly or high level?跟进this comment:
在为Arduino平台编译C++代码时,可以使用虚函数、异常等吗?或者您想(必须)使用 C++ 的一个子集(如the comment 中所述)?
为 Arduino 平台编程时还有其他注意事项吗?
【问题讨论】:
标签: c++ arduino virtual-functions firmware
Arduino 环境使用 GCC 工具链的 AVR 版本。代码编译为 C++,因此您可以使用类。虚拟功能是可能的; vtables 将存储在 .data 部分并具有正确的地址。事实上,Print 基类使用虚函数来使各种“打印”方法适应不同的输出类型。
由于代码空间原因,不支持异常。 Arduino 环境将“-fno-exceptions”传递给编译器命令行。请参阅the source 进行验证。
支持模板。例如,this no-cost stream insertion operator technique 使用简单的模板和内联运算符即可正常工作。
【讨论】:
Arduino 软件使用 avr-gcc 编译草图。以下限制来自avrlibc FAQ (Can I use C++ on the AVR?):
支持
不支持
new 和delete(尝试使用它们会导致链接器抱怨未定义的外部引用)。这意味着对象只能在堆栈上创建。如果需要动态内存分配,则必须使用C 类型的malloc() 和free() 来实现-fno-exceptions 明确关闭它们。这是由 Arduino IDE 在启动 avr-gcc 时自动完成的
其他问题
extern "C" { . . . } 【讨论】:
new 限制可能已修复,所以它可能已经修复,而常见问题解答现在已过时?
new - 这是LibraryTutorial 所做的),类总是可以的。并且引用的常见问题解答说虚函数也可以。
功能的可用性不受平台限制,而是受您使用的编译器的限制。
我会检查您的编译器文档以了解支持哪些语言功能。
【讨论】:
Comeau computing 有一个 C++ 到 C 编译器,它支持所有 C++ 特性。不只是虚函数或异常,还有导出。您需要调用 Comeau 以使其以 Arduino 语言为目标,但应该不会太难。
【讨论】:
文档说:
Arduino 语言基于 C/C++,支持所有标准 C 结构和一些 C++ 特性。
它没有说明我能找到的虚函数。
我尝试了一个简单的程序,它编译得很好。不过,我还没有在 Arduino 硬件上测试过它。
编辑:我也没有测试异常。
【讨论】:
我将 g++ 与 this Makefile 一起使用,并从 this code 开始。 C++ 浪费了一些空间。但是protothreads太酷了,不能用。
【讨论】: