96 votes

Quelle norme C ++ est la valeur par défaut lors de la compilation avec g ++?

J'ai un morceau de code qui ressemble à la suivante. Disons que c'est dans un fichier nommé example.cpp

#include <fstream>
#include <string> // line added after edit for clarity

int main() {
    std::string filename = "input.txt";
    std::ifstream in(filename);

    return 0;
}

Sur un ordinateur windows, si je tape dans l' cmd la commande g++ example.cpp, ce sera un échec. Il ya une longue liste d'erreurs je pense surtout que grâce à l'éditeur de liens se plaindre de ne pas être en mesure de convertir string de const char*.

Mais si je lance le compilateur à l'aide d'un argument supplémentaire comme suit: g++ -std=c++17 example.cpp,, elle compile et fonctionne bien avec pas de problèmes.

Ce qui se passe quand je lance l'ancienne commande? Je devine un défaut de la version standard du C++ compilateur est appelée, mais je ne sais pas qui? Et en tant que programmeur/développeur, dois-je toujours utiliser la dernière commande avec l'argument supplémentaire?

106voto

Michael Burr Points 181287

Si votre version de g++ est plus tard que de 4,7 je pense que vous pouvez trouver la version par défaut de C++ standard pris en charge comme suit:

g++ -dM -E -x c++  /dev/null | grep -F __cplusplus

Un exemple tiré de ma machine:

mburr@mint17 ~ $ g++ --version | head -1
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
mburr@mint17 ~ $ g++ -dM -E -x c++  /dev/null | grep -F __cplusplus
#define __cplusplus 199711L

Quelques références:

25voto

Benitok Points 359

Vous pouvez également vérifier avec gdb

  1. $ g++ example.cpp -g De la compilation du programme avec -g drapeau pour générer les informations de débogage
  2. $ gdb a.out Programme de débogage à l'aide de gdb
  3. (gdb) b main Mettre un point d'arrêt au principal
  4. (gdb) run Exécuter le programme (en pause au point d'arrêt)
  5. (gdb) info source

Imprime quelque chose comme:

Current source file is example.cpp
Compilation directory is /home/xxx/cpp
Located in /home/xxx/cpp/example.cpp
Contains 7 lines.
Source language is c++.
Producer is GNU C++14 6.3.0 20170516 -mtune=generic -march=x86-64 -g.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.

Il est la norme utilisée par le compilateur: Producer is GNU C++14

Si vous recompilez votre programme à l'aide d' -std=c++11 (par exemple), gdb détecte: Producer is GNU C++11

16voto

AnInquiringMind Points 268

Je crois qu'il est possible de dire en regardant la page de man (au moins pour g++):

En vertu de la description de l' -std, la page de man de listes de toutes les normes C++, y compris la GNU dialectes. En vertu d'une norme spécifique, c'est plutôt discrètement déclaré, This is the default for C++ code. (il y a un analogue de déclaration pour les normes C: This is the default for C code.).

Par exemple, pour g++/gcc version 5.4.0, c'est répertoriée sous gnu++98/gnu++03, alors que, pour d' g++/gcc version 6.4.0, c'est répertoriée sous gnu++14.

14voto

Basile Starynkevitch Points 67055

Je devine une version par défaut du compilateur C++ est appelée, mais je ne sais pas qui?

C'est seulement deviner en lisant la documentation de votre version de compilateur.

Si vous utilisez une récente de GCC, je vous recommande d'abord de comprendre de quelle version utilisez-vous en cours d'exécution

g++ -v

ou

g++ --version

et puis reportez-vous à la version de la version particulière de la GCC. Par exemple pour GCC 7, lire GCC 7 changements etc

Sinon, exécutez

g++ -dumpspecs

et de déchiffrer la valeur par défaut donc appelé le fichier spec.

BTW, vous pouvez vous assurer (par exemple dans certains de vos fichier d'en-tête) que le C++ est au moins C++17 par codage

 #if __cplusplus < 201412L
 #error expecting C++17 standard
 #endif

et j'ai effectivement vous recommandons de le faire de cette façon.

PS. En fait, pense de C++98 Et C++17 deux différentes langues (par exemple, comme Ocaml4 et C++11). Besoin de votre utilisateur de disposer d'un compilateur supportant certains régimes de la langue standard (par exemple C++11), pas une version de GCC. Lire également sur les gestionnaires de paquets.

6voto

Bathsheba Points 23209

En tapant g++ --version de votre commande shell va révéler la version du compilateur, et de ce que vous pouvez en déduire la valeur par défaut standard. Si vous ne pouvez pas dire directement, mais vous pouvez en déduire , avec un peu d'effort.

Les compilateurs sont censés pour #define __cplusplus qui peut être utilisé pour extraire la norme qu'ils prétendent mettre en œuvre au moment de la compilation; mais beaucoup ne le font pas encore faire cela.

(Et n'oubliez pas d'inclure toutes les C++ standard library en-têtes dont vous avez besoin: où est la pour std::string par exemple? Ne comptez pas sur votre C++ de la bibliothèque standard de mise en œuvre, y compris d'autres en-têtes automatiquement en faisant cela, vous ne sont pas de l'écriture de portable C++.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X