Arduino C++代码:您可以使用虚函数和异常吗?

cbr*_*lak 15 c++ virtual-functions arduino firmware

编写固件:汇编或高级别的问题开始对此评论进行跟进:

在为Arduino平台编译C++代码时,您可以使用虚函数,异常等吗?或者你想(必须)使用C++的一个子集(如评论所述)?

在为Arduino平台编程时还有其他注意事项吗?

Ben*_*bee 14

Arduino环境使用GCC工具链的AVR版本.代码编译为C++,因此您可以使用类.虚拟功能是可能的; vtable将存储在.data部分中,并具有正确的地址.实际上,Print基类使用虚函数来使各种"print"方法适应不同的输出类型.

由于代码空间原因,不支持异常.Arduino环境将"-fno-exceptions"传递给编译器命令行.请参阅源代码以进行验证.

支持模板.例如,这种免费的流插入操作符技术使用简单的模板和内联运算符可以正常工作.


Mat*_*och 11

Arduino软件使用avr-gcc编译草图.以下限制来自avrlibc FAQ(我可以在AVR上使用C++吗?):

支持的

  • 虚拟功能
  • 构造函数和析构函数(包括全局函数)

不支持

  • C++标准函数,类和模板类(但是请参阅uClibc ++ for Arduino的这个端口)
  • 运算符newdelete(尝试使用它们会导致链接器抱怨未定义的外部引用).这意味着只能在堆栈上创建对象.如果需要动态内存分配就必须要使用malloc()free()C类型
  • 例外.由于在C++前端默认启用了异常,因此需要-fno-exceptions在编译器选项中明确使用它们.这是由Arduino IDE在启动时自动完成的avr-gcc

其他问题

  • 一些提供的包含文件不是C++安全的,即它们需要包装
    extern "C" { . . . }

  • 过时的答案,目前的Arduino支持新/删除,模板,C++类. (3认同)