2009-10-22 2 views
0

Я хотел бы закодировать некоторые макросы перед процессором, чтобы, при необходимости, записать некоторую информацию. Например, в .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 

в .m я реализую как:

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

код работает отлично, как я представил его. Однако я не думаю, что мой случай «ничего не делать» такой же легкий, как это могло бы быть. Я ожидал, чтобы написать:

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

Поскольку одинокая точка с запятой является действительным Objective-C заявление, я ожидал, что это будет работать, но компилятор говорит мне:

expected expression before ';' token 

Мой вопрос: действительно ли Я выбираю самый легкий оператор «ничего не делать», используя 1==1, или есть менее интенсивный способ сделать это. Или, может быть, мой подход к временному ведению журнала отладки неверен?

ответ

4

Самое простое пустое определение:

#define ML_DEBUG(x) 

Это работает для большинства случаев, но это не работает с тройным оператором, например:

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

Для того, чтобы работать для этого (предположительно надуманный), вы можете сделать это:

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

Это совершенно правильно, to void - он говорит компилятору, что вы явно игнорируете результат выражения.

Именно по этой причине стандартный макрос ANSI C assert() превращается в ((void)0), когдаопределяется вместо пустой инструкции.

Смежные вопросы