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