Код Arduino C ++: можете ли вы использовать виртуальные функции и исключения? - PullRequest
15 голосов
/ 20 января 2009

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

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

Есть ли другие замечания при программировании для платформы Arduino?

Ответы [ 6 ]

14 голосов
/ 08 апреля 2009

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

Исключения не поддерживаются по причинам кода. Среда Arduino передает «-fno-exception» в командную строку компилятора. См. источник для проверки этого.

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

11 голосов
/ 17 июня 2009

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

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

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

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

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

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

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

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

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

2 голосов
/ 22 января 2009

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

1 голос
/ 03 марта 2009

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

1 голос
/ 21 января 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...