Макрос отладки препроцессора для дополнительной регистрации

StackOverflow https://stackoverflow.com/questions/1604592

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top