Как я могу использовать c++11
при программировании Arduino? Я буду в порядке, используя Arduino IDE или другую среду. Меня больше всего интересуют улучшения языка ядра, а не вещи, которые требуют изменений стандартной библиотеки.
По состоянию на версия 1.6.6, IDE Arduino по умолчанию включает c ++ 11.
Для более старых версий читайте дальше:
Сменить флаги очень просто для любого элемента цепочки инструментов, в том числе ассемблер, компилятор, компоновщик или архиватор.
Протестировано на Arduino IDE версии 1.5.7 (выпущено в июле 2014 г.),
Например,
Чтобы включить поддержку C ++ 11 (C ++ 0x), протестированный в Arduino IDE версий 1.5.7 и 1.5.8, вы просто добавите флаг «-std = gnu ++ 11» в конце строки, начинающейся с compiler.cpp.flags = «.
Ожидается, что C ++ 11 включен по умолчанию в ближайшем будущем на Arduino IDE. Однако с версией 1.5.8 (октябрь 2014 г.) это все еще не так.
В Arduino IDE 1.6.6 и новее C ++ 11 включен по умолчанию (у них установлен флаг компилятора «-std = gnu ++ 11» в файле platform.txt).
Во-первых, только gcc
4.7 и выше (и, следовательно, avr-gcc
4.7 и выше) поддержка C++11
, Итак, проверьте версии, установленные с:
gcc --version
avr-gcc --version
Если avr-gcc
4,7 или выше, то вы можете использовать C++11
,
Arduino IDE не поддерживает пользовательские флаги компилятора. Это было запрошенный но еще не было реализовано.
Таким образом, вам остается необходимость использовать другие среды или компилировать вашу программу прямо из командной строки.
В случае компиляции непосредственно из командной строки, используя avr-gcc
Вам просто нужно добавить дополнительный флаг компилятора для включения поддержки C ++ 11.
-std=c++11
Для конкретных среда разработки, большинство из них будет поддерживать редактирование флагов компилятора из опций сборки в IDE. Вышеупомянутый флаг необходимо добавить в список флагов для каждой среды.
C++0x
было название рабочего проекта C++11
стандарт. C++0x
поддержка доступна gcc
4.3 года. Тем не менее, это исключительно экспериментальная поддержка, поэтому вы не можете ожидать C++11
особенности присутствовать. Вот полный список функций, доступных с соответствующей версией gcc
, Наличие функций в avr-gcc
будет таким же, как то, что доступно в соответствующем gcc
версия.
Флаг компилятора для C++0x
является :
-std=c++0x
Обратите внимание, что нет простого способа указать дополнительные флаги в Arduino IDE или использовать другую IDE (Eclipse, Code Blocks и т. Д.) Или командную строку.
В качестве хака вы можете использовать небольшую прокси-программу (должна быть кроссплатформенной):
//============================================================================
// Name : gcc-proxy.cpp
// Copyright : Use as you want
// Description : Based on http://stackoverflow.com/questions/5846934/how-to-pass-a-vector-to-execvp
//============================================================================
#include <unistd.h>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
vector<string> arguments;
vector<const char*> aptrs;
// Additional options, one per line
ifstream cfg((string(argv[0]) + ".ini").c_str());
if (cfg.bad())
cerr << "Could not open ini file (you're using proxy for some reason, er?)" << endl;
string arg;
while (cfg) {
getline(cfg, arg);
if(arg == "\r" || arg == "\n")
continue;
arguments.push_back(arg);
}
for (const string& arg : arguments)
aptrs.push_back(arg.c_str());
for (int i = 1; i < argc; ++i)
aptrs.push_back(argv[i]);
// Add null pointer at the end, execvp expects NULL as last element
aptrs.push_back(nullptr);
// pass the vector's internal array to execvp
const char **command = &aptrs[0];
return execvp(command[0], command);
}
Вы сделали!
Пример avr-g ++. Ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
Надеюсь, это поможет!
я использую Я нет и это сработало:
ino build -cppflags="-std=c++0x"
Это сгенерировало шестнадцатеричный файл размером не менее 15 КБ (с включенными оптимизациями) по сравнению с 5 КБ для стандартной сборки, что является соображением для плохой маленькой Atmega328. Может быть хорошо для одного из микроконтроллеров с гораздо большим количеством программного пространства.