2009-10-22 6 views
0

Je voudrais coder dans certaines macros de pré-processeur pour consigner éventuellement des informations. Par exemple, dans le .hMacro de débogage du préprocesseur pour la journalisation facultative

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (1==1) // flip this bit to silence 

dans le .m je mets en œuvre comme:

ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)])); 

Le code fonctionne bien comme je l'ai présenté. Cependant, je ne pense pas que mon cas de "ne rien faire" soit aussi léger qu'il pourrait l'être. Je me attendais à écrire:

//#define ML_DEBUG(x) (x) // flip this bit to do the error logging 
#define ML_DEBUG(x) (;) // flip this bit to silence 

Depuis un point-virgule seul est une déclaration valide objective-c, je pensais cela fonctionnerait, mais le compilateur me dit:

expected expression before ';' token 

Ma question est: Est-ce Je choisis l'instruction "ne rien faire" la plus légère, en utilisant 1==1 ou y at-il une manière moins intensive de le faire. Ou peut-être que toute mon approche de la journalisation de débogage temporaire est erronée?

Répondre

4

La chose la plus simple est une définition vide:

#define ML_DEBUG(x) 

Cela fonctionne pour la plupart des cas, mais il ne fonctionne pas avec l'opérateur ternaire, par exemple:

something ? ML_DEBUG(x) : ML_DEBUG(y); 

Afin de travailler pour cette (admettons artificiel) exemple, vous pouvez le faire:

#define ML_DEBUG(x) ((void)0) 

Il est parfaitement valide de jeter des choses void - il indique au compilateur que vous ignorez explicitement le résultat de l'expression.

C'est pour cette raison que la macro standard ANSI C assert() est transformée en ((void)0) lorsque NDEBUG est définie à la place de l'instruction vide.

Questions connexes