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

StackOverflow https://stackoverflow.com/questions/461836

Вопрос

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

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

Есть ли еще какие-нибудь предостережения при программировании для платформы Arduino?

Это было полезно?

Решение

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

Исключения не поддерживаются по причинам пространства кода. Среда Arduino передает & Quot; -fno-exceptions & Quot; в командной строке компилятора. См. источник для проверки этого .

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

Другие советы

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

Поддерживается

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

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

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

Другие вопросы

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

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

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

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

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

  

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

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

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

РЕДАКТИРОВАТЬ: Я также не проверял исключения.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top