Pré-processador macro de depuração para o registo opcional
-
05-07-2019 - |
Pergunta
Eu gostaria de código em alguns macros pré-processador para registrar opcionalmente algumas informações. Por exemplo, no .h
//#define ML_DEBUG(x) (x) // flip this bit to do the error logging
#define ML_DEBUG(x) (1==1) // flip this bit to silence
no .m I implementar como:
ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)]));
O código fina funciona como eu apresentei-lo. No entanto, eu não acho que o meu caso "não fazer nada" é tão leve quanto poderia ser. Eu esperava escreve:
//#define ML_DEBUG(x) (x) // flip this bit to do the error logging
#define ML_DEBUG(x) (;) // flip this bit to silence
Desde um ponto e vírgula solitário é uma indicação objetiva-c válida, eu esperava que isso iria funcionar, mas o compilador está me dizendo:
expected expression before ';' token
A minha pergunta é: se eu escolher o mais leve "não fazer nada" declaração, usando 1==1
ou se existe uma maneira menos intensiva para fazer isso. Ou talvez toda a minha abordagem para o registro de depuração temporária é equivocada?
Solução
A coisa mais simples é uma definição vazia:
#define ML_DEBUG(x)
Isso funciona para a maioria dos casos, mas não funciona com o operador ternário, por exemplo:.
something ? ML_DEBUG(x) : ML_DEBUG(y);
Para trabalho para este exemplo (reconhecidamente inventado), você pode fazer isso:
#define ML_DEBUG(x) ((void)0)
É perfeitamente válido para as coisas elenco de anular - ele diz para o compilador que você está ignorando explicitamente o resultado da expressão
. É por esta razão que o assert()
macro padrão ANSI C se transformou em ((void)0)
quando NDEBUG
é definido em vez da instrução vazia.