129 votes

Comment activer C++11 dans gcc ?

J'utilise gcc 4.8.1 à partir de http://hpc.sourceforge.net sur Mac OSX Mountain Lion. J'essaye de compiler un programme C++ qui utilise la fonction to_string fonction dans <string> . J'ai besoin d'utiliser le drapeau -std=c++11 à chaque fois :

g++ -std=c++11 -o testcode1 code1.cpp

Existe-t-il un moyen d'inclure cet indicateur par défaut ?

97voto

Silouane Gerin Points 283

H2CO3 a raison, vous pouvez utiliser un makefile avec l'ensemble CXXFLAGS avec -std=c++11. Un makefile est un simple fichier texte contenant des instructions sur la façon de compiler votre programme. Créez un nouveau fichier nommé Makefile (avec un M majuscule). Pour compiler automatiquement votre code, tapez simplement la commande faire dans un terminal. Vous devrez peut-être installer make.

En voici un simple :

CXX=clang++
CXXFLAGS=-g -std=c++11 -Wall -pedantic
BIN=prog

SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)

all: $(OBJ)
    $(CXX) -o $(BIN) $^

%.o: %.c
    $(CXX) $@ -c $<

clean:
    rm -f *.o
    rm $(BIN)

Il suppose que tous les fichiers .cpp sont dans le même répertoire que le makefile. Mais vous pouvez facilement modifier votre fichier makefile pour supporter des répertoires src, include et build.

Modifier : J'ai modifié le compilateur c++ par défaut, ma version de g++ n'est pas à jour. Avec clang++ ce makefile fonctionne bien.

27voto

Tomasz Gandor Points 426

Comme mentionné précédemment - dans le cas d'un projet, Makefile ou sinon, il s'agit d'un problème de configuration du projet, où vous devrez probablement spécifier d'autres drapeaux également.

Mais qu'en est-il des programmes ponctuels, pour lesquels il suffirait normalement d'écrire g++ file.cpp && ./a.out ?

Eh bien, j'aimerais beaucoup avoir quelques #pragma pour l'activer au niveau de la source, ou peut-être une extension par défaut - disons .cxx o .C11 ou autre, le déclenche par défaut. Mais à ce jour, cette fonctionnalité n'existe pas.

Mais, comme vous travaillez probablement dans un environnement manuel (c'est-à-dire un shell), vous pouvez simplement avoir un alias dans votre fichier .bashrc (ou autre) :

alias g++11="g++ -std=c++0x"

ou, pour un G++ plus récent (et quand vous voulez sentir le "vrai C++11")

alias g++11="g++ -std=c++11"

Vous pouvez même utiliser un alias pour g++ lui-même, si vous détestez à ce point le C++03 ;)

8voto

DrowsySaturn Points 1497

Je pense que vous pourriez le faire en utilisant un fichier de spécifications.

Sous MinGW, vous pourriez exécuter
gcc -dumpspecs > specs

Où il est dit

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}

Vous le changez en

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -std=c++11

Et ensuite le placer dans
/mingw/lib/gcc/mingw32/<version>/specs

Je suis sûr que vous pourriez faire la même chose sans construire un MinGW. Mais je ne sais pas où placer le fichier de spécifications.

Le dossier est probablement soit /gcc/lib/ soit /gcc/.

0voto

Si vous utilisez sublime, ce code peut fonctionner si vous l'ajoutez dans build comme code pour le système de construction. Vous pouvez utiliser ce lien pour plus d'informations.

{
    "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
    ]
}

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