2010-03-05 10 views
6

Tengo una sección de código que se puede resumir de la siguiente manera;¿Por qué el siguiente código no genera una advertencia en MSVC

void MyFunc() 
{ 
    int x; 
' 
' 
    x; 
' 
' 
} 

yo habría pensado que simplemente hace referencia a una variable, sin modificarlo en cualquier forma o el uso de su valor en cualquier caso debe generar una advertencia. En el VS2003 no funciona, y necesito pelusa para recogerlo.

Me doy cuenta de que no afecta a la ejecución, pero dado que es una pieza de código que no hace nada, y el programador tiene la intención de hacer algo, ¿por qué no está marcado?

De manera similar, ¿espera que x = x sea una advertencia?

Editar: Pregunta modificada, ya que esto constituye un buen candidato para una advertencia, pero no es un error. Las respuestas sugieren que esto se maneja mejor con otros compiladores. Intentará VS2008 más tarde y publicará el resultado.

+0

qué ¿daría un error? La sintaxis es correcta. – Grumpy

+0

Quizás no sea un error, pero sin duda una advertencia. if (x = y) también es sintácticamente correcto, pero generalmente no es lo que el programador pretendía.Yo diría que cualquier código que con toda probabilidad no es lo que el programador pretendía debería generar una advertencia, y no puedo ver esa adición de una declaración al código que no hace nada en absoluto la intención de la mayoría de los programadores. –

Respuesta

1

Es necesario utilizar un compilador mejor :-) compilado con la -Wall y banderas -pedantic, compilador GCC C++ dado este código:

int main() { 
    int x = 0; 
    x; 
} 

produce este diagnóstico:

ma.cpp:3: warning: statement has no effect 
+0

PC-Lint hace lo mismo para mí, muy lentamente;) error 522: (Advertencia: tipo de vacío esperado, asignación, incremento o decremento) Sorprendente es la cantidad de estos que encuentro borrando una gran base de código, todos los errores en este caso. –

+1

@Shane Si PC-Lint es demasiado lento, es posible que desee investigar GCC. El puerto MinGW (obtenga la versión en http://tdragon.net/recentgcc) compilará felizmente el código de Windows. –

1

Tal código puede aparecer en una clase de plantilla para la metaprogramación. Por ejemplo, podría ser una especie de comprobación de si se puede acceder al x desde el contexto actual. Sí, no afecta el resultado de la ejecución , pero sí afecta el resultado de la compilación ; esto podría ser de ayuda para técnicas como SFINAE.

Parece que tampoco sirve de nada la compilación. Los cuerpos de Funciton no cuentan para elegir la plantilla adecuada para una llamada de función. Y para verificar la accesibilidad dentro del alcance de una clase, debe usar el operador using para nombres dependientes; este operador using en sí es una verificación de accesibilidad.

Por lo tanto, el código x; realmente no tiene ningún efecto.

+0

@Pavel Shved, no entiendo tu punto. Si 'x' no es accesible desde el contexto actual en una instanciación de plantilla, esto da como resultado un error de compilación, ¿no? Que supera a SFINAE –

+0

+1 para la edición y las conclusiones. –

1

Uno esperaría que una advertencia a menos que lances la expresión de anular, es decir

void MyFunc() 
{ 
    int x; 

    (void)x; 

} 

¿Qué nivel de alerta ¿Tiene establecido?

+0

/W4, nivel más alto en VS2003, sí, esperaría una advertencia. (Mientras pasa una mañana trotando a través de la salida de pelusa). –

+0

'gcc -Wall' da:' lint.c: 5: advertencia: declaración sin efecto' –

+0

Intel ICC da: 'lint.c (5): observación # 174: expresión no tiene efecto' y' lint.c (5): advertencia n. ° 592: se usa la variable "x" antes de que se establezca su valor ' –

0

Ambas declaraciones con una sola variable (tales como x;) y auto-asignación (como x = x) son código válido en C++, por lo que el compilador no puede marcarlos como errores, pero un buen el compilador puede, por supuesto, advertir que no tienen ningún efecto y pueden ser errores del programador. Por ejemplo, el compilador g ++ da la advertencia "la declaración no tiene efecto" para x;.

Cuestiones relacionadas