J'essaie de mettre à jour mon compilateur C++ vers C++ 11. J'ai un peu cherché et je suis arrivé à la conclusion que je devais utiliser le drapeau -std=c++0x
ou -std=gnu++0x
, mais je ne sais pas grand chose des drapeaux. Quelqu'un peut-il m'aider? (J'utilise Ubuntu 12.04.)
Voici l'erreur que je reçois du compilateur lorsque j'essaie d'utiliser une bibliothèque incluse dans C++ 11 (c'est-à-dire un tableau):
#include <array>
#include <iostream>
int main()
{
std::array<int, 3> arr = {2, 3, 5};
...
}
Ce fichier nécessite la prise en charge du compilateur et de la bibliothèque pour la prochaine norme ISO C++, C++ 0x. Cette prise en charge est actuellement expérimentale et doit être activée avec les options du compilateur -std = c ++ 0x ou -std = gnu ++ 0x.
Les drapeaux (ou les options du compilateur) ne sont rien d’autre que des arguments de ligne de commande ordinaires passés à l’exécutable du compilateur.
En supposant que vous appelez g ++ à partir de la ligne de commande (terminal):
$ g++ -std=c++11 your_file.cpp -o your_program
ou
$ g++ -std=c++0x your_file.cpp -o your_program
si ce qui précède ne fonctionne pas.
Vous pouvez vérifier votre g++
par la commande:
which g++
g++ --version
cela vous indiquera quel complier est actuellement pointé.
Pour passer à g++
4.7 (en supposant que vous l'avez installé sur votre ordinateur), exécutez:
Sudo update-alternatives --config gcc
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gcc-4.6 60 auto mode
1 /usr/bin/gcc-4.6 60 manual mode
* 2 /usr/bin/gcc-4.7 40 manual mode
Puis sélectionnez 2
comme sélection (Ma machine pointe déjà sur g++
4.7, donc le *)
Une fois que vous changez de client, lancez à nouveau g++ --version
pour vérifier que la commutation a bien eu lieu.
Maintenant, compilez votre programme avec
g++ -std=c++11 your_file.cpp -o main
Votre Ubuntu a vraiment une version suffisamment récente de g ++. Le drapeau à utiliser est -std=c++0x
.
Si vous souhaitez conserver les extensions du compilateur GNU, utilisez -std = gnu ++ 0x plutôt que -std = c ++ 0x. Voici une citation de la page de manuel:
Le compilateur peut accepter plusieurs normes de base, telles que c89 ou c ++ 98, et les dialectes GNU de ces normes, telles que gnu89 ou gnu ++ 98. En spécifiant une norme de base, le compilateur acceptera tous les programmes respectant cette norme et ceux utilisant les extensions GNU qui ne la contredisent pas. Par exemple, -std = c89 désactive certaines fonctionnalités de GCC incompatibles avec ISO C90, telles que les mots clés "asm" et "typeof", mais pas les autres extensions GNU n'ayant aucune signification dans ISO C90, par exemple en omettant le terme moyen d'une expression "?:". D'autre part, en spécifiant un dialecte GNU d'une norme, toutes les fonctionnalités prises en charge par le compilateur sont activées, même lorsque ces fonctionnalités changent la signification de la norme de base et que certains programmes strictement conformes peuvent être rejetés. La norme particulière est utilisée par -pedantic pour identifier les fonctionnalités qui sont des extensions GNU étant donné cette version de la norme. Par exemple -std = gnu89 -pedantic mettrait en garde sur les commentaires // de style C++, alors que -std = gnu99 -pedantic ne le ferait pas.
Vous pouvez vous référer à la suite lien pour laquelle les fonctionnalités sont supportées dans une version particulière du compilateur. Il contient une liste exhaustive de fonctionnalités prises en charge par le compilateur. Looks GCC suit la norme de près et implémente avant tout autre compilateur.
Concernant votre question, vous pouvez compiler en utilisant
g++ -std=c++11
pour C++ 11g++ -std=c++14
pour C++ 14g++ -std=c++17
pour C++ 17g++ -std=c++2a
pour C++ 20, bien que toutes les fonctionnalités de C++ 20 ne soient pas encore prises en charge, reportez-vous à lien pour obtenir la liste des fonctionnalités prises en charge dans GCC.La liste change assez rapidement, gardez un œil sur celle-ci si vous attendez que certaines fonctionnalités soient prises en charge.