Jak włączyć C ++ 11 w Qt Creator?

167

Tytuł jest dość samoopisowy. Pobrałem Qt Creator 2.7.0 i próbuję skompilować podstawowy kod C ++ 11:

int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
  x *= 2;
}

Otrzymuję następujący błąd:

range based for loops are not allowed in c++ 98 mode

Jednak zgodnie z tym artykułem ta wersja Qt Creator obsługuje C ++ 11. Jak więc to włączyć?

Andrey Chernukha
źródło
3
Qt Creator nie jest kompilatorem. Kiedy czytasz, że „Qt Creator obsługuje C ++ 11”, oznacza to, że mechanizm uzupełniania kodu (w tym przypadku Clang) obsługuje składnię C ++ 11.
cmannett85
@ cmannett85 Qt Creator nadal nie używa Clang jako parsera składni C ++. Były wysiłki, ale API Clanga i ogólna wydajność tego rozwiązania opóźniły to. Obecne prace w tym kierunku znajdują się tutaj .
rubenvb

Odpowiedzi:

261

Według tej strony dodaj

CONFIG += c++11

do pliku .pro (zobacz na dole tej strony internetowej). Wymaga Qt 5.


Inne odpowiedzi, sugerujące

QMAKE_CXXFLAGS += -std=c++11(lub QMAKE_CXXFLAGS += -std=c++0x)

działa również z Qt 4.8 i gcc / clang.

Ali
źródło
4
Anonimowe głosy przeciw nikomu nie pomagają. Co jest nie tak z odpowiedzią?
Ali
Problem polegał na tym, że nie mogłem usunąć Twojej zduplikowanej / niekompletnej odpowiedzi, jedyne, co mogłem zrobić, to przegłosować. Teraz, gdy zredagowałeś go, aby był bardziej reprezentacyjny, cieszę się tylko z negatywnego głosu.
nurettin
9
@nurettin Dzięki za informację zwrotną. Jeśli dokładnie przeanalizujesz historię edycji odpowiedzi (moją i innych), zobaczysz, że moja pierwotna odpowiedź nie była duplikatem; w rzeczywistości była to druga odpowiedź, która bezwstydnie ukradła część mojej odpowiedzi, przez co moja odpowiedź wyglądała jak duplikat. W tym roku pojawiły się jeszcze dwie zduplikowane odpowiedzi. Sprawdź to sam w historii edycji. Biorąc pod uwagę te informacje, czy rozważyłbyś ponownie swój głos przeciw?
Ali
3
@Troyseph Oto moje rozumienie sytuacji. Zakładam, że używasz gcc. Jeśli wersja gcc obsługuje -std=c++11, to powinna również obsługiwać -std=c++0xflagę (przestarzała) , a obie flagi powinny mieć identyczne efekty (co najwyraźniej nie ma miejsca na twoim komputerze). Jeśli kompilator obsługuje -std=c++0x, nie oznacza to, że rozumie -std=c++11. Dlatego wybranie -std=c++0xjako domyślnego trybu zgodności z C ++ 11 jest rozsądnym wyborem. Na moim komputerze, przynajmniej według strony człowieka , -std=c++0xi -std=c++11są identyczne.
Ali
1
@Troyseph Prawdą jest, że byłoby lepiej, -std=c++11gdyby kompilator go obsługiwał, a Qt mógłby być na tyle sprytny, aby to zrobić. Cóż, jeśli ten problem cię tak boli, możesz zgłosić błąd ...
Ali
32

Dodaj to do swojego pliku .pro

QMAKE_CXXFLAGS += -std=c++11

lub

CONFIG += c++11
LemonCool
źródło
18

Jako alternatywę dla załatwienia obu przypadków, do których odnosi się doskonała odpowiedź Ali, zwykle dodam

# With C++11 support
greaterThan(QT_MAJOR_VERSION, 4){    
CONFIG += c++11
} else {
QMAKE_CXXFLAGS += -std=c++0x
}

do moich plików projektu. Może to być przydatne, gdy tak naprawdę nie zależy ci na tym, której wersji Qt używają ludzie w twoim zespole, ale chcesz, aby w każdym przypadku włączono C ++ 11.

Яois
źródło
Powinno to być -std = c ++ 11
Predrag Manojlovic
8

dodaj do swojego pliku qmake

QMAKE_CXXFLAGS+= -std=c++11
QMAKE_LFLAGS +=  -std=c++11
guardezi
źródło
4

Jeśli używasz wcześniejszej wersji QT (<5), spróbuj tego

QMAKE_CXXFLAGS += -std=c++0x
asloob
źródło
1

Jedyne miejsce, w którym udało mi się to udać, to wyszukiwanie w:

... \ Qt \ {5,9; lub Twoja wersja} \ mingw {53_32; lub Twoja wersja} \ mkspecs \ win32-g ++ \ qmake.conf:

Następnie na linii:

QMAKE_CFLAGS           += -fno-keep-inline-dllexport

Edytować :

QMAKE_CFLAGS           += -fno-keep-inline-dllexport -std=c++11
Bretzelus
źródło