Compiler C ++ 11 avec g ++

368

J'essaie de mettre à jour mon compilateur C ++ vers C ++ 11. J'ai cherché un peu et je suis arrivé à la conclusion que je dois utiliser le drapeau -std=c++0xou -std=gnu++0x, mais je ne sais pas beaucoup de choses sur les drapeaux. Quelqu'un peut-il m'aider? (J'utilise Ubuntu 12.04.)

Voici l'erreur que j'obtiens 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 le support 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.

Rontogiannis Aristofanis
la source
5
Dans la dernière version, vous devrez probablement utiliser à la -std=c++11place. Peut-être que les deux sont autorisés, cependant.
6
Cela manque beaucoup de contexte. Montrez la commande complète que vous avez essayée (peut-être même un exemple de code que vous avez essayé de compiler) et ce qui a réellement échoué.
KillianDS
4
@classdaknok_t: les deux devraient être autorisés, également ubuntu 12.04 est livré g++-4.6par défaut (qui ne prend en charge que -std=c++0x)
KillianDS
3
Ajoutez des drapeaux juste après g++, par exemple g++ -std=c++0x _filename_ && ./a.out.
n. «pronoms» m.
1
Je suis tombé sur ce post, à la recherche d'un message d'erreur intitulé. Im travaillant sur un projet QMAKE, la solution pour moi était d'ajouter CONFIG + = c ++ 11 au fichier .pro.

Réponses:

529

Les indicateurs (ou options du compilateur) ne sont 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.

Oskar N.
la source
8
N'oubliez pas de mettre -Wall -gjuste aprèsg++
Basile Starynkevitch
7
@BasileStarynkevitch: J'ajouterais -Werroraussi, aucune raison de ne pas le faire lors du démarrage d'un projet.
Matthieu M.
3
Une meilleure prise en charge de C ++ 11 est discutable et de meilleurs diagnostics ne semblent pas tellement meilleurs de nos jours (la page de Clang les décrivant utilise GCC 4.2 qui est ancien) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely
58
Est-ce que quelqu'un sait si / quand les compilateurs C ++ prendront en charge la norme C ++ 11 par défaut, c'est-à-dire sans indicateur?
Dennis
2
Et si vous ne le savez pas déjà, dans Visual C ++, utilisez simplement VC11 (Visual Studio 2012) ou supérieur pour avoir des fonctionnalités C ++ 11
gerrytan
44

Vous pouvez vérifier votre g++commande par:

which g++
g++ --version

cela vous dira quel complice il pointe actuellement.

Pour passer à g++4.7 (en supposant que vous l'avez installé sur votre machine), 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

Sélectionnez ensuite 2comme sélection (Ma machine pointe déjà surg++ 4.7, donc le *)

Une fois que vous changez de complicateur, puis lancez g++ --version à pour vérifier que la commutation s'est déroulée correctement.

Compilez maintenant votre programme avec

g++ -std=c++11 your_file.cpp -o main
Harajyoti Das
la source
Il peut être utile de mentionner que des versions comme g ++ 4.4 peuvent être tout simplement trop anciennes pour faire certaines fonctionnalités, une mise à niveau est donc nécessaire. La mise à niveau dépendra de votre système, et j'éviterais les méthodes de compilation de g ++ vous-même et de remplacement du compilateur du système pour référence
Colin D
13

Votre ubuntu a définitivement une version suffisamment récente de g ++. Le drapeau à utiliser est -std=c++0x.

Michael Slade
la source
Comment pouvez-vous dire cela, il utilise ubuntu?. Juste curieux de savoir.
Shravan40
22
@ Shravan40 OP dit explicitement I'm using Ubuntu 12.04.dans la question.
Timothy Gu
10

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, tels que gnu89 ou gnu ++ 98. En spécifiant une norme de base, le compilateur acceptera tous les programmes suivant cette norme et ceux utilisant des extensions GNU qui ne la contredisent pas. Par exemple, -std = c89 désactive certaines fonctionnalités de GCC qui sont incompatibles avec ISO C90, telles que les mots clés "asm" et "typeof", mais pas les autres extensions GNU qui n'ont pas de signification dans ISO C90, telles que l'omission le moyen terme d'une expression "?:". D'un autre côté, 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 modifient 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 compte tenu de cette version de la norme. Par exemple-std = gnu89 -pedantic avertirait au sujet du style C ++ // commentaires, tandis que -std = gnu99 -pedantic ne le ferait pas.


la source
Et qu'est-ce que cela vous apporte, à part l' ?:opérateur binaire ? La seule autre extension qui me vient à l'esprit, les expressions de structure, est remplacée par l'initialisation de la liste C ++ 11. Dans tous les cas, cette citation concerne principalement C, pas C ++.
Potatoswatter
9

Vous pouvez vous référer au lien suivant pour lequel les fonctionnalités sont prises en charge dans une version particulière du compilateur. Il a une liste exhaustive de prise en charge des fonctionnalités dans le compilateur. Apparemment, GCC suit de près la norme et l'implémente avant tout autre compilateur.

Concernant votre question, vous pouvez compiler en utilisant

  1. g++ -std=c++11 pour C ++ 11
  2. g++ -std=c++14 pour C ++ 14
  3. g++ -std=c++17 pour C ++ 17
  4. g++ -std=c++2apour C ++ 20, bien que toutes les fonctionnalités de C ++ 20 ne soient pas encore prises en charge, reportez-vous à ce lien pour obtenir la liste des fonctionnalités dans GCC.

La liste change assez rapidement, gardez un œil sur la liste, si vous attendez qu'une fonctionnalité particulière soit prise en charge.

yadhu
la source