2010-11-01 9 views
6

estoy usando g ++ 4.3.0 para compilar este ejemplo:Una variable no detecta como no se utiliza

#include <vector> 

int main() 
{ 
    std::vector<int> a; 
    int b; 
} 

Si puedo compilar el ejemplo con el nivel máximo de alerta, recibo una advertencia de que la variable b es no utilizados:

[[email protected] data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic 
m.cpp: In function ‘int main()’: 
m.cpp:7: warning: unused variable ‘b’ 
[[email protected] data_create]$ 

la pregunta es: ¿por qué la variable un no se declara como no se utiliza? ¿Qué parámetros tengo que pasar para obtener la advertencia de la variable a?

+0

Algunas advertencias de análisis de código GCC solo funcionan (o funcionan mejor) si también utiliza la optimización, intente con -O2 o -O3 –

+0

@Laurynas Biveinis Creo que las respuestas son correctas. El nivel de optimización no juega ningún papel en este caso (para asegurarse de que lo intenté). –

Respuesta

23

En teoría, el constructor predeterminado para std::vector<int> podría tener efectos secundarios arbitrarios, por lo que el compilador no puede determinar si la eliminación de la definición de a cambiaría la semántica del programa. Solo recibe esas advertencias para los tipos integrados.

Un mejor ejemplo es una cerradura:

{ 
    lock a; 
    // ... 
    // do critical stuff 
    // a is never used here 
    // ... 
    // lock is automatically released by a's destructor (RAII) 
} 

Aunque a no se utiliza después de su definición, la eliminación de la primera línea sería un error.

+0

Excelente respuesta/ejemplo. Utilicé un ejemplo similar hace un tiempo cuando explicaba el mismo concepto a un cliente. Client luchó contra mí con uñas y dientes, argumentando que "lock a" se optimizaría ya que "no se usó". Expliqué que se garantizaba que no se eliminaría (efectos secundarios del constructor/destructor - adquisición/liberación de mutex). Según recuerdo, finalmente tuve que encontrar capítulo y versículo en el estándar que apoya mi punto. Intentaremos buscar y publicar de nuevo. – Dan

1

a no es un tipo incorporado. En realidad, está llamando al constructor de std::vector<int> y asignando el resultado a a. El compilador ve esto como uso porque el constructor podría tener efectos secundarios.

1

a se utiliza realmente después de declararse, ya que se llama a su destructor al final de su ámbito.

Cuestiones relacionadas