2010-11-15 26 views
6

En uno de los archivos de código fuente C I conocer la línea siguiente (macro):definir el uso (x) (x) = (x)

#define USE(x) (x) = (x) 

Se utiliza como esto:

int method(Obj *context) 
    { 
    USE(context); 
    return 1; 
    } 

Tras google para ello, me encontré con la siguiente descripción:

// Macro para deshacerse de algunas advertencias del compilador

¿Podría decirme más sobre esta macro?

Gracias por sus respuestas!

+0

¿Cómo se utiliza esta macro? – kennytm

+0

@DrTJ: ¿Eres usuario507960? De todos modos, no puede ser 'x = USE (10);' porque la macro expandida 'x = (10) = (10);' no se compilará. – kennytm

+0

La macro se define en el archivo .h, pero uno de los ejemplos tiene este aspecto: int método (Obj * context) { USE (contexto); return 1; } – Cybex

Respuesta

13

Algunos compiladores se quejan cuando las variables nunca se usan realmente para nada. por ejemplo:

int main(int argc, char **argv) { 
    return 0; 
} 

Da:

Output from llvm C/C++/Fortran front-end (llvm-gcc) 

/tmp/webcompile/_7618_1.c: In function 'main': 
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argc' 
/tmp/webcompile/_7618_1.c:9: warning: unused parameter 'argv' 

extrañamente, sólo puede deshacerse de esas advertencias usando la macro:

#define USE(x) (x) = (x) 


int main(int argc, char **argv) { 
    USE(argc); /* get rid of warnings */ 
    USE(argv); /* get rid of warnings */ 
    return 0; 
} 
+0

Ha me ganaste :) –

+3

Secreto salsa: http://llvm.org/demo/index.cgi compilador C/C++ a su alcance! – SingleNegationElimination

+0

¡Gracias por la información! – Cybex

8

Los compiladores dan advertencias cuando se define una variable/declarado pero nunca usado. Estos incluyen argumentos de funciones. Algunos estilos de codificación requieren siempre nombrar argumentos de funciones, pero algunos de ellos no se pueden usar en la función. Están reservados para uso futuro. Para estos casos, puede USE(param) para evitar la advertencia

+1

¿Por qué no mantener la advertencia? –

+1

@the_drow, en algún caso se le pedirá que compile su código con la opción del compilador "Tratar advertencias como errores". –

+5

@the_drow: Por lo general, es una mala idea tener advertencias. Cuando te acostumbras a ellos, finalmente ya no los leerás y luego te perderás los importantes. Es una idea aún peor intentar simplemente silenciarlos mediante alguna solución alternativa, p. un yeso, en lugar de eliminar su razón. Por supuesto, a veces la solución en realidad * es * un yeso. Otra versión común de la macro USE es '#define USE (x) ((void) (x))'. – Secure

4

La mayoría (si no todos) de los principales compiladores ofrecerán advertencias si las variables locales no se utilizan dentro de la función que se definen. Imagino que esa macro realiza una operación arbitraria en alguna variable para garantizar que no se marque ninguna advertencia para la variable.

void func1(void) 
{ 
    int unusedVariable = 0; 
    /* do stuff without using unusedVariable */ 
} /* warning about not using unusedVariable */ 

void func2(void) 
{ 
    int unusedVariable = 0; 
    USE(unusedVariable); 
    /* do stuff without using unusedVariable */ 
} /* no warning is issued */ 
5

Con gcc puede usar __attribute__((unused)) para suprimir la advertencia.

+1

Desafortunadamente, esto no es portátil. – nneonneo

Cuestiones relacionadas