2011-01-31 7 views
15

Al implementar stubs, etc., debe evitar las advertencias de "variables no utilizadas". Me he encontrado con algunas alternativas de macros de UNUSED() a lo largo de los años, pero nunca se ha probado que ninguna de ellas funcione para "todos" los compiladores, o una que por norma es hermética.Método independiente del compilador universal de implementar una macro SIN USAR en C/C++

¿O estamos atrapados con bloques #ifdef para cada plataforma de compilación?

EDIT: Debido a una serie de respuestas con alternativas no compatible c-, me gustaría aclarar que estoy buscando una definición que es válido tanto para C y C++, todos los sabores, etc.

+5

Ninguno de los estándares dice nada acerca de cuándo o cómo se pueden emitir advertencias, por lo que no hay forma de que cualquier cosa sea hermética según los estándares en cualquiera de los idiomas que está solicitando. –

+0

@Steve: De hecho, línea de pensamiento torpe. – sharkin

+0

posible duplicado de [Will a "variableName;" ¿La declaración de C++ es no operativa en todo momento?] (Http://stackoverflow.com/questions/4030959/will-a-variablename-c-statement-be-a-no-op-at-all-times) –

Respuesta

30

según this answer por user GMan la típica forma es para echar a void:

#define UNUSED(x) (void)(x) 

pero si x se marca como volatile que hacer cumplir la lectura de la variable y por lo tanto tienen un efecto secundario y por lo tanto la forma real de garantizar casi un no-op y suprimir la advertencia del compilador es la siguiente:

// use expression as sub-expression, 
// then make type of full expression int, discard result 
#define UNUSED(x) (void)(sizeof((x), 0)) 
+4

Supongo que debería hacer +1. :) – GManNickG

+2

¿Has encontrado una respuesta muy completa y elegiste la peor de las soluciones sugeridas? Por cierto, cuando ya existe una respuesta en SO, es una buena señal de que la pregunta es una tontería. –

+0

@Ben: Estaba considerando hacer un comentario similar, pero para la intención y el propósito de la macro, creo que esto es bastante canónico. (Es decir, solo para usar un parámetro y no una expresión.) – GManNickG

1

En C++, basta con comentar los nombres.

void MyFunction(int /* name_of_arg1 */, float /* name_of_arg2*/) 
{ 
    ... 
} 
+2

que no es legal C code ... – Christoph

+4

-1, como simple C esto ni siquiera compila – sharkin

+2

esta es una solución solo para C++. No tiene sentido tener una única solución que funcione tanto para C como para C++; el punto es que esto funciona para todos los compiladores/plataformas en C++. Una solución C es independiente. – tenfour

-2

La manera universal es no activar las opciones de advertencia que las advertencias de spam para el código claramente correcto. Cualquier opción de advertencia de "variable no utilizada" que incluya argumentos de función en su análisis es simplemente incorrecta y debe dejarse desactivada. No ensucie su código con fealdad para calmar los compiladores rotos.

También puede intentar enviar un informe de error al mantenedor/proveedor del compilador.

+0

Realmente estoy de acuerdo en cierto sentido. Sin embargo, incluso si dudo en pasar el problema a mantener los desactivadores de advertencia en su lugar, algunos compiladores no admiten advertencias individuales que se deshabiliten. – sharkin

+0

Siempre que el compilador que utiliza para el desarrollo admita la desactivación de advertencias individuales, todo está bien. Simplemente deshabilite todas las advertencias en sistemas que no sean de desarrollo, si es necesario. Seguramente gcc y MSVC soporten la desactivación de esta advertencia ... –

+1

Además, el comportamiento deseado es generalmente: "Avisar a menos que se indique lo contrario". Si la barra vacía (int foo), no tiene UNUSED (foo), la advertencia NO debe ser supresada – aiao

Cuestiones relacionadas