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

时间:2009-01-20 15:44:47

标签: c++ arduino virtual-functions firmware

在问题this comment上跟进Writing firmware: assembly or high level?

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

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

6 个答案:

答案 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?)

<强>支持的

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

不支持

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

其他问题

  • 一些提供的包含文件不是C ++安全的,即它们需要用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太酷了。