为Arduino平台编译C++代码时,可以使用虚函数、异常等吗?还是您想(必须)使用 C++ 的一个子集(如评论中所述)?
为 Arduino 平台编程时还有其他注意事项吗?
Arduino 环境使用 GCC 工具链的 AVR 版本。代码编译为 C++,因此您可以使用类。虚拟功能是可能的;vtables 将存储在 .data 部分并具有正确的地址。事实上,Print 基类使用虚函数来使各种“打印”方法适应不同的输出类型。
由于代码空间原因,不支持异常。Arduino 环境将“-fno-exceptions”传递给编译器命令行。请参阅来源以验证这一点。
支持模板。例如,这种免费的流插入运算符技术使用简单的模板和内联运算符就可以很好地工作。
Arduino 软件使用 avr-gcc 来编译草图。以下限制来自avrlibc 常见问题解答(我可以在 AVR 上使用 C++ 吗?):
支持的
不支持
new
和delete
(尝试使用它们将导致链接器抱怨未定义的外部引用)。这意味着对象只能在堆栈上创建。如果需要动态内存分配,则必须使用malloc()
and free()
ofC
类型来实现-fno-exceptions
由于 C++ 前端默认启用异常,因此需要在编译器选项中明确关闭它们。这是由 Arduino IDE 在启动时自动完成的avr-gcc
其他问题
extern "C" { . . . }
功能的可用性不受平台限制,而是受您使用的编译器的限制。
我会检查您的编译器文档以了解支持哪些语言功能。
Comeau 计算有一个 C++ 到 C 编译器,它支持所有 C++ 特性。不只是虚函数或异常,还有导出。您需要调用 Comeau 以使其以 Arduino 语言为目标,但应该不会太难。
文档说:
Arduino 语言基于 C/C++,支持所有标准 C 结构和一些 C++ 特性。
它没有说明我能找到的虚函数。
我尝试了一个简单的程序,它编译得很好。不过,我还没有在 Arduino 硬件上测试过它。
编辑:我也没有测试异常。
我在这个 Makefile中使用了 g++并从这个代码开始。C++ 浪费了一些空间。但是 protothreads 太酷了,不能用。