2010-11-15 9 views
6

Dans l'un des fichiers de code source C je trouve la ligne suivante (macro):définir USE (x) (x) = (x)

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

Il est utilisé comme ceci:

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

Après googler, je trouve la description suivante:

// Macro pour se débarrasser de certains compilateur avertissements

Pourriez-vous m'en dire plus sur cette macro?

Merci pour vos réponses!

+0

Comment cette macro est-elle utilisée? – kennytm

+0

@DrTJ: Êtes-vous user507960? Quoi qu'il en soit, cela ne peut pas être 'x = USE (10);' car la macro développée 'x = (10) = (10);' ne se compilera pas. – kennytm

+0

La macro est définie dans le fichier .h, mais l'un des exemples ressemble à ceci: méthode int (contexte Obj *) { USE (contexte); return 1; } – Cybex

Répondre

13

Certains compilateurs se plaignent lorsque les variables ne sont jamais réellement utilisées pour quoi que ce soit. par exemple:

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

donne:

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' 

drôlement, je peux me débarrasser de ces avertissements en utilisant votre 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 vous me battre :) –

+3

Sauce secrète: http://llvm.org/demo/index.cgi Compilateur C/C++ à portée de main! – SingleNegationElimination

+0

Merci pour l'info! – Cybex

8

Les compilateurs donnent des avertissements lorsqu'une variable est définie/déclaré mais jamais utilisé. Ceux-ci incluent des arguments de fonction. Certains styles de codage nécessitent de toujours nommer les arguments de fonction, mais certains d'entre eux peuvent ne pas être utilisés dans la fonction. Ils sont réservés pour un usage futur. Pour ces cas, vous pouvez USE(param) éviter l'avertissement

+1

Pourquoi ne pas garder l'avertissement? –

+1

@the_drow Dans certains cas, vous devrez compiler votre code avec l'option de compilation "Traiter les avertissements en tant qu'erreurs". –

+5

@the_drow: C'est généralement une mauvaise idée de garder des avertissements. Quand vous vous y habituerez, vous ne les lirerez plus et vous manquerez les plus importants. C'est une idée encore pire d'essayer de les faire taire simplement par une solution de contournement, par exemple. une distribution, au lieu d'éliminer sa raison. Bien sûr, parfois la solution * est * un cast. Une autre version courante de la macro USE est '#define USE (x) ((void) (x))'. – Secure

4

La plupart des compilateurs majeurs (si ce n'est tous) offrent des avertissements si les variables locales ne sont pas utilisées dans la fonction définie. J'imagine que la macro fait une opération arbitraire sur une variable pour s'assurer qu'aucun avertissement n'est marqué pour 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

Avec gcc vous pouvez utiliser __attribute__((unused)) pour supprimer l'avertissement.

+1

Malheureusement, ce n'est pas portable. – nneonneo

Questions connexes