Макрос отладки препроцессора для дополнительной регистрации - PullRequest
0 голосов
/ 22 октября 2009

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

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

expected expression before ';' token

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

1 Ответ

4 голосов
/ 22 октября 2009

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

#define ML_DEBUG(x)

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

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

Чтобы поработать с этим (по общему мнению) надуманным примером, вы можете сделать следующее:

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

Совершенно справедливо приводить вещи к пустоте - это говорит компилятору, что вы явно игнорируете результат выражения.

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

...