Come abilitare C ++ 11 in Qt Creator?


167

Il titolo è piuttosto auto-descrittivo. Ho scaricato Qt Creator 2.7.0 e sto cercando di compilare un codice C ++ 11 di base:

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

Ricevo il seguente errore:

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

Tuttavia, secondo questo articolo questa versione di Qt Creator supporta C ++ 11. Quindi come posso abilitarlo?


3
Qt Creator non è un compilatore. Quando leggi che "Qt Creator supporta C ++ 11" significa che il motore di completamento del codice (Clang in questo caso) supporta la sintassi C ++ 11.
cmannett85,

@ cmannett85 Qt Creator non utilizza ancora Clang come parser di sintassi C ++. Ci sono stati sforzi, ma l'API di Clang e le prestazioni generali di questa soluzione hanno ritardato questo. I lavori attuali in questa direzione si trovano qui .
rubenvb,

Risposte:


261

Secondo questo sito aggiungere

CONFIG += c++11

al tuo file .pro (vedi in fondo a quella pagina web). Richiede Qt 5.


Le altre risposte, suggerendo

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

funziona anche con Qt 4.8 e gcc / clang.


4
I voti anonimi non stanno aiutando nessuno. Cosa c'è che non va nella risposta?
Ali,

Il problema era che non ero in grado di eliminare la tua risposta duplicata / incompleta, tutto quello che potevo fare era ridimensionarla. Ora che l'hai modificato per renderlo più presentabile, sono contento solo del downvote.
Nurettin,

9
@nurettin Grazie per il feedback. Se esaminerai attentamente le storie modificate delle risposte (la mia e le altre), vedrai che la mia risposta originale non era un duplicato; era in realtà l'altra risposta che ha spudoratamente rubato parte della mia risposta, facendo sembrare la mia risposta un duplicato. Quindi quest'anno sono comparse altre due risposte duplicate. Controllalo tu stesso nella cronologia delle modifiche. Date queste informazioni, riconsiderereste il vostro voto negativo?
Ali,

3
@Troyseph Ecco la mia comprensione della situazione. Presumo che tu stia usando gcc. Se una versione di gcc supporta -std=c++11, allora dovrebbe anche supportare anche il -std=c++0xflag (deprecato) , e si suppone che entrambi i flag abbiano effetti identici (che a quanto pare non è il caso sulla tua macchina). Se un compilatore supporta -std=c++0x, ciò non significa che capisca -std=c++11. Pertanto, selezionare -std=c++0xcome predefinito per la modalità di compatibilità C ++ 11 è una scelta ragionevole. Sulla mia macchina, almeno secondo la pagina man , -std=c++0xe -std=c++11sono identici.
Ali,

1
@Troyseph Ora, è vero che sarebbe meglio usare -std=c++11se il compilatore lo supporta, e Qt potrebbe essere abbastanza intelligente da farlo. Bene, se questo problema ti fa così male, potresti presentare una segnalazione di bug ...
Ali,

32

Aggiungi questo al tuo file .pro

QMAKE_CXXFLAGS += -std=c++11

o

CONFIG += c++11

18

In alternativa alla gestione di entrambi i casi affrontati nella risposta eccellente di Ali, aggiungo di solito

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

ai miei file di progetto. Questo può essere utile quando non ti interessa davvero quale versione di Qt sono le persone che usano nel tuo team, ma vuoi che abbiano C ++ 11 abilitato in ogni caso.


Questo dovrebbe essere -std = c ++ 11
Predrag Manojlovic

8

aggiungi al tuo file qmake

QMAKE_CXXFLAGS+= -std=c++11
QMAKE_LFLAGS +=  -std=c++11

4

Se si utilizza una versione precedente di QT (<5) provare questo

QMAKE_CXXFLAGS += -std=c++0x

1

L'unico posto in cui sono riuscito a farlo funzionare è la ricerca in:

... \ Qt \ {5,9; o la tua versione} \ mingw {53_32; o la tua versione} \ mkspecs \ win32-g ++ \ qmake.conf:

Quindi alla linea:

QMAKE_CFLAGS           += -fno-keep-inline-dllexport

Modificare :

QMAKE_CFLAGS           += -fno-keep-inline-dllexport -std=c++11
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.