Макрос отладки препроцессора для дополнительной регистрации
-
05-07-2019 - |
Вопрос
Я бы хотел написать код в некоторых макросах препроцессора, чтобы при желании записывать некоторую информацию Например, в .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
или есть менее интенсивный способ сделать это. Или, может быть, весь мой подход к временному ведению журнала отладки ошибочен?
Решение
Самое простое - пустое определение:
#define ML_DEBUG(x)
Это работает в большинстве случаев, но не работает с троичным оператором, например:
something ? ML_DEBUG(x) : ML_DEBUG(y);
Чтобы поработать с этим (по общему мнению, надуманным) примером, вы можете сделать это:
#define ML_DEBUG(x) ((void)0)
Совершенно справедливо приводить вещи к пустоте - это говорит компилятору, что вы явно игнорируете результат выражения.
По этой причине стандартный макрос ANSI C assert ()
превращается в ((void) 0)
при определении NDEBUG
вместо пустого оператора.