2008-11-21 12 views

Respuesta

51

La función con un parámetro no utilizada puede tener un fallo real en los siguientes casos:

  1. hay un parámetro salida, que no está siendo asignado o escribe en, resultando en valor indefinido para la llamador.

  2. Uno de los parámetros es un puntero a la función de devolución de llamada, que debe invocar y olvidarse de hacerlo. Puede suceder si hay muchos #ifdef s en la función.

  3. Declara una variable local con el mismo nombre que sombrea un parámetro y utiliza posteriormente el valor incorrecto en la función.

No usar una entrada parámetros puede ser inofensivo, pero se puede reducir el ruido para ver advertencias de utilidad mediante el marcado de los parámetros de entrada no utilizados de forma explícita en el comienzo de la función echándola por void (que funciona para tanto en C y C++):

(void)param1; 

O

#define UNUSED(expr) do { (void)(expr); } while (0) 
... 

void foo(int param1, int param2) 
{ 
    UNUSED(param2); 
    bar(param1); 
} 

u omitir el nombre del parámetro (C++ solamente):

void foo(int param1, int /*param2*/) 
{ 
    bar(param1); 
} 
+5

Por cierto, el enfoque con macro SIN USAR se usa en la biblioteca Qt: tiene un Q_UNUSED, que hace exactamente lo mismo, pero sin el envoltorio 'do..while'. –

+0

De hecho, parece una expresión común. Lo he visto en algunos lugares. –

+0

¿Podría agregar un ejemplo de cómo lanzar al vacío? (Lo probé y funciona, pero parece tan raro que nunca pensé que se compilaría, y estoy seguro de que otros sienten lo mismo.) –

1

Ninguno. excepto [EDIT]: como han señalado otros, podría tener un parámetro de salida no asignado.

Debes limpiarlos, porque en muchas ocasiones he visto que los desarrolladores ignoran las advertencias importantes que estaban 'escondidas' entre una gran cantidad de advertencias, y estaban tan acostumbrados a ver advertencias que nunca les prestaron atención. Intento tener cero advertencias en todo momento y establecer las advertencias del compilador al nivel máximo.

14

Si tiene un montón de advertencias sin importancia que no son importantes para usted, puede pasar por alto la advertencia importante sobre la línea de código que acaba de escribir que se esconde en el medio de ellas.

+3

Esta es una razón muy importante para no ignorar las advertencias. Probablemente la razón más importante. –

1

Significa que usted escribió una función que toma un parámetro pero no usa el parámetro. Es inofensivo, pero podría indicar errores en algunos casos.

En general, puede silenciar esta advertencia eliminando el nombre del parámetro, dejándolo anónimo, pero puede no ser conveniente dependiendo de por qué no se usa el parámetro.

Le sugiero que desactive la advertencia si dificulta la búsqueda de los problemas reales.

+0

¿Podría explicar cómo un parámetro no utilizado podría "... indicar errores en algunos casos"? ?? –

+1

int foo (int a, int b, int c) {barra de retorno (a) + barra (a) + barra (c); } // oops, error de copiar y pegar, debe llamar a la barra (b) – MSalters

0

Si un método no utiliza un parámetro a continuación, la primera pregunta que surge es por eso es que los parámetros de una parte de la firma del método en el primer lugar.Estas advertencias tienen sentido ya que es un mal diseño al que se refieren y además, también hay un poco de sobrecarga que cada vez que se llama a este método, este parámetro se inserta en la pila, por lo que lo mejor es refactorizar el método y eliminarlo tales parámetros que no tienen ningún uso.

Habiendo dicho eso, dejar estos parámetros no daña mucho excepto por un poco de sobrecarga que mencioné.

1

Eso depende de si tenía la intención de utilizar el parámetro. P.ej.

const int Size = 12; // intended for use in some other function 

char* MakeBuffer(int size) 
{ 
    return new char[Size]; 
} 

En este código no se usa el "tamaño", y en su lugar se usa el "Tamaño" constante. Entonces, la advertencia resaltará problemas de este tipo para usted.

Sin embargo, si nunca sangraste para usar el parámetro, simplemente debería eliminarse de la firma del método. A menos que necesite hacer coincidir una firma para un método virtual o un puntero de función, si ese es el caso, entonces no tiene la opción de eliminarlo.

1

En C++ se puede tener argumentos por defecto:

int sum(int first, int second=0){ // should not give warning 
    return first+first; 
} 

También puede tener argumento extra:

int sum(int first, int second){  // should give warning 
    first *= 2; 
    return first; 
} 

Si usted tiene un parámetro que no está utilizando y no es defecto, Debería recibir una advertencia porque le está pidiendo al programa que pase valores extra a la pila que nunca se mencionan, y por lo tanto está haciendo más trabajo de lo que debería.

Quizás también signifique que olvidó parte de la lógica de la función.

+0

Creo que los valores todavía se pasan a la función si no hay un parámetro formal. Simplemente no hay un nombre local para acceder al valor por. –

+0

Estoy confundido por este ejemplo: incluso con el argumento predeterminado, ¿por qué querría el segundo parámetro en ese ejemplo? Si pasa algo o no, nunca será utilizado. Lo único que puedo pensar es si no lo estás usando ahora pero anticipas que la API necesitará la información en el futuro. –

14

Para una manera específica gcc para desactivar la alarma, se puede utilizar como __attribute__((unused))

void foo(int a, int b __attribute__((unused))) { 

} 

Ignorar el segundo parámetro. Si su programa ya se basa en tecnologías GCC, puede usar ese atributo para estar 100% seguro de ese tipo de advertencia.

Cuestiones relacionadas