Какой стандарт C++ поддерживает язык Arduino?

arduino-ide c++ coding-standards

"Языком Arduino" (как они его называют) Arduino IDE 1, очевидно, является C++. Какой именно C++?

Я попытался разобраться в этом сам (Arduino IDE 1.8.13 для Arduino Uno), но не могу понять, какой стандарт C++ он поддерживает.

Судя по этим тестам, он поддерживает C++14

  • Поддерживаются шаблоны переменных C++ 14 (шаблон<имя типа T> constexpr T pi = T(3.1415926535);<имя типа T>)

  • Поддерживаются лямбда-захваты C++ 14 (автоматическая лямбда = [значение = 1] {возвращаемое значение;};)

  • Поддерживается устаревший C++ 14 ([[устаревший]]int fdep(){возврат 5;})

Но не полностью:

  • C++ 14-значные разделители не поддерживаются (int j = 2'000;)

Из этих тестов видно, что он даже поддерживает некоторые C++17:

  • Поддерживаются вложенные определения пространств имен (пространство имен X:: Y {int func(){ возвращает 1; } })

Но и не полностью:

  • Символы UTF-8 не поддерживаются (символ x = u8'a';)

Если он частично поддерживает все, есть ли обзор, такой как список или таблица, где я могу его просмотреть?

, 👍9

Обсуждение

Он поддерживает все, что поддерживает конкретное ядро и компилятор, которые вы используете, и настроен для поддержки. Включите подробную компиляцию, и вы увидите команды, которые она выполняет, включая флаги командной строки (-std* и т. Д.)., @Majenko

посмотри вокруг https://arduino.github.io/arduino-cli/0.19/platform-specification/#recipes-to-compile-source-code, @Juraj

Я ожидаю, что ваши тесты дадут разные результаты на разных версиях Arduino IDE и разных платах., @Dmitry Grigoryev


1 ответ


Лучший ответ:

14

"Язык" Arduino-это не что иное, как набор функций и классов C++. Он не требует какого-либо конкретного стандарта C++.

Стандарт диктуется исключительно компилятором, который поддерживает используемое вами ядро (и настроен для использования с помощью флагов командной строки).

Разные ядра используют разные компиляторы. Разные версии одного и того же ядра используют разные компиляторы. Разные компиляторы обеспечивают разные стандартные уровни C++.

Большинство ядер используют GCC или какой-либо его вариант. Это может быть что угодно, от GCC 3.x.x до самого последнего выпуска (что бы это ни было на этой неделе).

В настоящее время ядро AVR использует GCC 7.3.0 и по умолчанию настроено на использование стандарта gnu++11 (хотя avr-gcc и связанные с ним библиотеки не имеют полной реализации STL). Вы, конечно, можете изменить это в файлах конфигурации, если хотите.

,

"не более чем набор функций и классов C++" - > И очень важная предварительная обработка, которая отсутствует, например, в PlatformIO., @AndreKR

@AndreKR Это на самом деле не часть языка - скорее, немного выдумки для удобства, которая в любом случае не должна существовать (и до недавнего времени все равно была ужасно нарушена)., @Majenko

Без этой предварительной обработки вам понадобилось бы что-то под названием "Защита заголовков", техника настолько странная, что мне трудно объяснить, почему она должна существовать., @AndreKR

@AndreKR Нет, это неправильно. Все, что делает предварительная обработка, - это очищает ваш код для функций и вставляет прототипы для вас в верхней части вашего скетча. Он ничего не делает с защитой заголовков, что вы всегда должны иметь в своих файлах заголовков, независимо от этого., @Majenko

Язык Arduino даже не полностью C++11, потому что [он не поддерживает std::erf() в C99 и C++11](https://stackoverflow.com/q/68720871/995714). https://godbolt.org/z/dP1W1xfW6, @phuclv

@phuclv вы путаете компилятор и STL, которые являются двумя разными вещами. В True avr-gcc отсутствует полный STL, но он по-прежнему является синтаксисом C++11 (с расширениями GCC)., @Majenko