Comment puis-je utiliser c++11
lors de la programmation de l'Arduino? Je serais bien en utilisant soit l'Arduino IDE ou un autre environnement. Je suis plus intéressé par les améliorations du langage de base, pas par des choses qui nécessitent des changements de bibliothèque standard.
Depuis version 1.6.6, l'Arduino IDE active c ++ 11 par défaut.
Pour les versions plus anciennes, lisez la suite:
Il est très facile de changer les drapeaux pour n'importe quel élément de la chaîne d'outils, y compris l'assembleur, le compilateur, l'éditeur de liens ou l'archiveur.
Testé sur l'Arduino IDE version 1.5.7 (sorti en juillet 2014),
Par exemple,
Pour activer la prise en charge de C++ 11 (C++ 0x), testé sur Arduino IDE versions 1.5.7 et 1.5.8, vous ajouterez simplement l'indicateur "-std = gnu ++ 11" à la fin de la ligne commençant par compiler.cpp.flags = ".
Il est prévu que C++ 11 soit activé par défaut dans un proche avenir sur l'IDE Arduino. Cependant, depuis la version 1.5.8 (octobre 2014) ce n'est toujours pas le cas.
Arduino IDE 1.6.6 et plus récent ont C++ 11 activé par défaut (ils ont l'indicateur de compilateur "-std = gnu ++ 11" défini dans le fichier platform.txt).
Premièrement, seulement gcc
4.7 et supérieur (et donc avr-gcc
4.7 et supérieur) support C++11
. Vérifiez donc les versions installées avec:
gcc --version
avr-gcc --version
Si avr-gcc
est de 4,7 ou plus, vous pourrez peut-être utiliser C++11
.
L'Arduino IDE ne prend pas en charge les drapeaux de compilateur personnalisés. Cela a été demandé mais n'a pas encore été implémenté.
Il vous reste donc à utiliser d'autres environnements ou à compiler votre programme directement à partir de la ligne de commande.
Dans le cas, de compiler directement à partir de la ligne de commande en utilisant avr-gcc
, il vous suffit d'ajouter un indicateur de compilation supplémentaire pour activer la prise en charge de C++ 11.
-std=c++11
Pour des environnements de développement spécifiques , la plupart prendraient en charge l'édition des drapeaux du compilateur à partir des options de construction dans l'EDI. L'indicateur mentionné ci-dessus doit être ajouté à la liste des indicateurs pour chaque environnement.
C++0x
était le nom du projet de travail du C++11
la norme. C++0x
le support est disponible gcc
4.3 en avant. Cependant, il s'agit d'un support strictement expérimental, vous ne pouvez donc pas réellement vous attendre à C++11
fonctionnalités présentes. Voici la liste complète des fonctionnalités disponibles avec la version correspondante de gcc
. La disponibilité des fonctionnalités dans avr-gcc
sera identique à ce qui est disponible dans la version gcc
correspondante.
L'indicateur du compilateur pour C++0x
est :
-std=c++0x
J'utilise Ino et cela a fonctionné:
ino build -cppflags="-std=c++0x"
Cela a généré un fichier hexadécimal d'au moins 15k (c'est-à-dire avec les optimisations activées), contre environ 5k pour la version standard, ce qui est une considération pour un pauvre petit Atmega328. Cela pourrait convenir à l'un des microcontrôleurs avec beaucoup plus d'espace de programme.
Veuillez noter qu'il n'y a pas de moyen facile de spécifier des indicateurs supplémentaires depuis Arduino IDE ou utilisez un autre IDE (Eclipse, blocs de code, etc.) ou la ligne de commande) .
En tant que hack, vous pouvez utiliser un petit programme proxy (devrait être multi-plateforme):
//============================================================================
// 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);
}
Vous avez terminé!
Exemple avr-g ++. Ini:
D:\Arduino\hardware\tools\avr\bin\avr-g++.orig.exe
-std=c++0x
J'espère que cela pourra aider!