2012-03-05 15 views
7

Cómo desactivar el resaltado de error (onda roja bajo el código) para operadores basados ​​en el rango de ciclos de C++ 11 como ese?QT Creator, comprobación de sintaxis para C++ 11

int myint[] = {1,2,3,4,5}; 
for (auto x : myint){/**/} 

El mensaje en pantalla muestra "token inesperado :". El código compila perfectamente.

Otro problema: la autocompleta no muestra unique_ptr en el espacio de nombre std::, aunque compila OK.

  • Qt Creator 2.4.0 Sobre la base de Qt 4.7.4 (32 bits), construido el 12 de diciembre en 2011 01:10:32
+2

Probablemente deba cerrarlo globalmente para deshacerse de él. Qt Creator probablemente no conozca la sintaxis de C++ 11. Alternativamente, puede encontrar una opción para configurarlo en el modo C++ 11. –

+1

Conoce auto, unique_ptr e incluso lambdas. Quiero decir que no hay ondas rojas y compila bien. –

+1

Eso no significa que conozca la sintaxis 'for' basada en el rango. –

Respuesta

4

Si va a escribir en C++ 11 se debería cambiar de usar QT Creator como IDE a usar Eclipse CDT. Al menos así es como resolví este problema. QT Creator no parece tener ninguna forma de personalizar esta comprobación de sintaxis en tiempo real. Eclipse, por otro lado, es ampliamente personalizable en este sentido.

Actualización: Creo que QtCreator ha mejorado su compatibilidad con las versiones más nuevas de C++ ya que esta respuesta fue dada, por lo que ya no es correcta. No puedo borrarlo ya que es una respuesta aceptada.

+1

Debo señalar aquí que probé QT Creator de nuevo recientemente y su compatibilidad con C++ 11 parece haber mejorado. No recuerdo si este problema específico fue reparado. –

+0

Estaba a punto de rechazar, pero noté la parte de Actualización. Creo que sería mejor si se coloca por encima de la respuesta original: no todos están lo suficientemente atentos para evitar la votación negativa sin leer toda la publicación. – Ruslan

0

Qt Creator está utilizando las definiciones de resaltado de sintaxis del editor Kate (de KDE). Ver Herramientas-Opciones-Editor de texto-Resaltador genérico.

Si Kate tiene una definición para C++ 11, puede usarla o puede desarrollar la suya propia.

+1

Resaltar está bien, 'for' y' auto' son negritas como de costumbre para las palabras clave. El análisis es incorrecto. –

+0

El resaltado de la sintaxis Kate también maneja, bueno, la sintaxis, no solo las palabras clave. Lo más fácil es, probablemente, tomar el de C++ y ajustarlo. – Koying

+0

Gracias, lo comprobaré. –

5

Hay "resaltado de sintaxis" (colorear) y hay "comprobación de sintaxis" (subrayado ondulado). El color de la sintaxis parece estar relacionado con Kate, como sugiere @Koying, puedes modificar los colores y desactivarlo. A partir de Qt Creator 2.5.0 no parece tener un problema con la mayoría de C++ 11 ejemplos me pega fuera de la web, a pesar de su ejemplo en efecto, todavía tienen el subrayado:

http://labs.qt.nokia.com/2012/05/09/qt-creator-2-5-0-released/

También desafortunadamente, al momento de la redacción (13 de junio de 2012, que es aproximadamente un mes después del lanzamiento), el último paquete SDK integrado aún está instalando Qt Creator 2.4.1 de manera predeterminada. : -/

Si este es el barco de alguien está en y quiere probar la última, no hacen lo que hice con la aniquilación de su Qt SDK instalar usando /opt/QtSDK/SDKMaintenanceTool! Ese tiempo perdido en una reinstalación, después de lo cual ejecuté un sudo rm -r /opt/QtSDK/QtCreator, y luego le dije a la nueva versión de Qt Creator que se instalara en /opt/QtSDK/QtCreator. Actualizaré esta publicación si encuentro un problema con esa opción.

http://qt-project.org/wiki/Qt_Creator_Releases

PERO aunque parece que funciona con muchas construcciones de C++ 11 no hace nada por su ejemplo, ni el caso particular Tropecé a través, que es el unspaced<nested<syntax>> para las plantillas.

(Nota: Puede parecer una cosa menor, pero es una gran característica de C++ 11 para mí me gusta se trata de tener que hacer ... tailspaced<nested<syntax> >.lo que me llevó a hacer siempre fullyspaced< nested<syntax> > en todas las plantillas para mantener las cosas consistentes. Incluso casos simples como vector<int>. Ahora que arreglaron el compilador, estoy listo para matar todo ese ruido de espacio en blanco.)

No parece que haya ninguna manera de desactivar los subrayados ondulados (unless you recompile Qt Creator ??).

in qt-creator-2.5.0-src\src\plugins\cpptools\cppmodelmanager.cpp: 

     QTextCharFormat errorFormat; 
     /* disable error underline 
     errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); 
     errorFormat.setUnderlineColor(Qt::red); 
     */ 

     // set up the format for the warnings. 
     QTextCharFormat warningFormat; 
     /* disable warning underline 
     warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); 
     warningFormat.setUnderlineColor(Qt::darkYellow); 
     */ 

De cualquier manera, es una consecuencia insana de duplicar el trabajo del compilador en el IDE en lugar de tener el código de front-end dos comparten. Vivimos en la edad oscura del software. ¿No alguien save us? [/ Diatriba]

He aquí algunos de los códigos correspondientes (creo):

https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/plugins/cppeditor/cpphighlighter.cpp

... y el léxico aquí, tenga en cuenta el miembro _cxx0xEnabled:

https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/libs/cplusplus/SimpleLexer.cpp#line80

Además de su sintaxis, el espaciado entre plantillas es lo único que encontré en C++ 11 que causa las líneas. ¡Eso es lo suficientemente importante para mí como para poder construir mi propio QtCreator para abordarlo!

10

No entiendo la línea de razonamiento en la respuesta de Andrew. ¿Por qué la personalización de la comprobación de sintaxis tiene sentido? La sintaxis es correcta, dado el contexto establecido por la línea de comandos del compilador, o es incorrecta. Si es incorrecto, debe marcarse como tal, si no, no. Si el código correcto está marcado como incorrecto, es un error, o al menos una característica no admitida, en el IDE, y necesita una solución, no una "personalización".

Una vez dicho esto, el ejemplo citado

int myint[] = {1,2,3,4,5}; 
    for (auto x : myint){/**/} 

funciona bien aquí (bastante reciente acumulación de rama principal).

Respecto al otro comentario sobre Kate: el resaltado de sintaxis de Kate es utilizado por Qt Creator como alternativa en casos donde no hay un resaltado de sintaxis específico disponible para un archivo. En el caso de C++ (98/03/11), se usa un modelo de código real, no las definiciones de Kate.