sintaxis resueltos principiantes para lenguaje funciones ejercicios ejemplos dev codigos c++ compiler-construction compiler-warnings

resueltos - ¿Cómo superar las advertencias inútiles del compilador de C++ de forma elegante?



lenguaje c++ (7)

Hay muchos casos en los que el código satisfactorio se comporta como se pretendía, pero genera una gran cantidad de advertencias. Es por eso que son advertencias en lugar de errores. El hecho de que te molesten es bueno: las advertencias tienen la intención de modificar tu comportamiento. Se supone que debes arreglar tus caminos, no barrerlos debajo de la alfombra.

El ciclo de ejemplo de la pregunta podría escribirse así:

for (; testExitCondition();) doSomething();

En casos más sofisticados, el contador de bucles se puede usar como el estado de una máquina de estados (cada acción es necesaria para actualizar el estado ):

for (int state = stateBegin; state == stateTerminate;) { switch (state) { case stateBegin: //elaborate setup break; case state_1: doSomething_1(); break; case state_2: doSomething_2(); break; case state_n: doSomething_n(); break; }

Mi forma favorita de evitar las inútiles advertencias de C ++ es usar C # :)

Es cierto que esto produce un montón de inútiles advertencias de C #, pero nada es perfecto.

Dios, mira los votos negativos. Prueba de que C ++ daña tu sentido del humor.

Esta pregunta no está sujeta a ninguna advertencia específica del compilador, el siguiente es solo un ejemplo.

Actualmente cuando quiero un ciclo que verifica una condición de salida en el interior:

while( true ) { doSomething(); if( condition() ) { break; } doSomethingElse(); }

No puedo simplemente escribir eso en Visual C ++ - emitirá una conditional expression is constant C4127 conditional expression is constant advertencia conditional expression is constant . El compilador lo agitará en la cara, aunque es bastante obvio que while(true) no puede haber sido escrito de forma accidental.

Supongamos que quiero código que compila sin advertencias. Hay soluciones en mi servicio.

La solución 1 es usar for(;;) pero se siente estúpido: ¿por qué querría esa cosa extraña en lugar de conciso y elegante idiomático while(true) ? La segunda solución es usar #pragma warning( suppress) antes de while( true ) line, pero agrega un enorme banner que es dos veces más grande que el while -statement. La solución tres es deshabilitar C4127 para todo el proyecto (lo he visto hecho en un proyecto real) pero luego todas las posibles instancias útiles de C4127 también están deshabilitadas.

¿Hay alguna manera elegante de deshacerse de una advertencia sin sentido?


Utilizo while (verdadero, 1) para suprimir esta advertencia.


Haz un poco de gracioso token pegando: si puedes intercambiar

while(true)

para

While(true)

entonces solo haz lo siguiente:

#define while_true for( ;; ) #define While(a) while_##a


Me iría for(;;) incluso sin esa advertencia. No es estúpido: es un bucle sin condición, que es exactamente lo que quieres expresar.

Eso me parece más lógico que usar un ciclo while y probar que true sigue siendo cierto cada vez que pasa el ciclo (por supuesto, el compilador optimizará esta prueba, por lo que no afectará el rendimiento).


Mi filosofía es que si haces que el compilador suprima las advertencias, escribe un comentario y di por qué. Incluso si piensas que es una tontería. Pragma se destaca y es visible. Es un buen comentario en tu código.

Cuando comienzas a omitir los comentarios al suprimir las advertencias basadas en tu idea sobre cuán tonto es, te estás dirigiendo a posibles problemas. Otra persona que trabaje en su código después de un año podría cambiarlo, tener problemas y perder un tiempo precioso en su búsqueda.

Por cierto, estás buscando una forma de suprimir las advertencias sin

  • Utilice pragma
  • Use un código feo
  • Utilice la supresión de todo el proyecto

Ese sería un método de supresión muy oculto.

Si no te gusta el aspecto de pragma, usa

bool alwaysTrue = true; // to prevent compiler warning C4127 while (alwaysTrue) { ... }


Escribiría for(;;) porque eso es idiomático.

Las versiones más nuevas de Visual C ++ no son tan idiotas como las versiones anteriores de wrt. advertencias Visual C ++ 10.0 compila el código que usa <windows.h> , en el nivel de advertencia 4, sin advertencias.

Pero si desea desactivar las advertencias tontas de Visual C ++, eche un vistazo a mi antiguo encabezado anti-sillywarnings , que se creó con la entrada de la comunidad [comp.lang.c ++].


Lo que podría ser, realísticamente implementable, más elegante que una sola línea de:

#pragma warning ( suppress : 4127 )

( No puedo usar esto ya que todavía estoy en VS2005, donde esto no funciona para todas las advertencias ).

Ciertamente, para su caso for(;;) podría ser el enfoque pragmático, pero en general

¿Cómo superar las advertencias inútiles del compilador de C ++ de forma elegante?

Yo diría deshabilitarlos en todo el proyecto . (No tiene sentido después de todo). Y, para variar

¿Cómo superar las advertencias falsas del compilador de C ++ de forma elegante?

Yo diría que una sola línea de preprocesador ya parece estar bien.