Код Arduino С++: можете ли вы использовать виртуальные функции и исключения?

Следуйте за этим комментарием из вопроса Написание прошивки: сборка или высокий уровень?:

При компиляции кода С++ для платформы Arduino вы можете использовать виртуальные функции, исключения и т.д.? Или вы хотите (нужно) использовать подмножество С++ (как описано в комментарий)?

Любые другие оговорки при программировании платформы Arduino?

Ответы

Ответ 1

В среде Arduino используется AVR-версия инструментальной цепочки GCC. Код скомпилирован как С++, поэтому вы можете использовать классы. Возможны виртуальные функции; vtables будут храниться в разделе .data и иметь правильные адреса. Фактически, базовый класс печати использует виртуальные функции для адаптации различных методов "печати" к различным типам выходных данных.

Исключения не поддерживаются из-за причин кода. Окружение Arduino передает "-fno-exceptions" в командную строку компилятора. См. источник для подтверждения этого.

Поддерживаются шаблоны. Например, эта техника оператора ввода без затрат потока отлично работает с использованием простого шаблона и встроенного оператора.

Ответ 2

Программное обеспечение Arduino использует avr-gcc для компиляции эскизов. Следующие ограничения были получены из avrlibc FAQ (могу ли я использовать С++ на AVR?):

Поддерживаемые

  • Виртуальные функции
  • Конструкторы и деструкторы (включая глобальные)

Не поддерживается

  • Стандартные функции С++, классы и классы шаблонов (но см. этот порт uClibС++ для Arduino)
  • Операторы new и delete (попытка их использования заставит компоновщика жаловаться на внешние ссылки undefined). Это означает, что объекты могут создаваться только в стеке. Если требуется распределение динамической памяти, оно должно быть реализовано с использованием malloc() и free() типов C
  • Исключения. Поскольку исключения по умолчанию включены в интерфейсе С++, они явно должны быть отключены с помощью -fno-exceptions в параметрах компилятора. Это делается автоматически с помощью Arduino IDE при запуске avr-gcc

Другие проблемы

  • Некоторые из поставляемых файлов include не являются С++ безопасными, т.е. их нужно обернуть с помощью
    extern "C" { . . . }

Ответ 3

Удобство использования функций не ограничено платформой, а скорее компилятором, который вы используете.

Я бы проверил вашу документацию компилятора на том, какие языковые функции поддерживаются.

Ответ 4

Comau computing имеет компилятор С++ для C, который поддерживает все возможности С++. Не только виртуальные функции, либо исключения, но и экспорт. Вам нужно будет позвонить Комо, чтобы заставить его ориентироваться на язык Ардуино, но не слишком сложно.

Ответ 5

Я использовал g++ с этот Makefile и начал с этот код. С++ тратит некоторое пространство. Но прототипы слишком круты, чтобы не использовать.

Ответ 6

В документации написано:

Язык Arduino основан на C/С++ и поддерживает все стандартные конструкторы C и некоторые С++-функции.

Он ничего не говорит о виртуальных функциях, которые я могу найти.

Я попробовал простую программу, и она отлично компилируется. Однако я не тестировал его на оборудовании Arduino.

EDIT: я также не тестировал исключения.