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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top