#ifdef DEBUG против #if DEBUG
Мне непонятно, когда используются директивы компилятора, какие из приведенных ниже двух фрагментов кода являются правильными/предпочтительными и почему. Похоже, что большинство разработчиков и проекты с открытым исходным кодом, которые я видел, используют первый, но я видел, что второй часто используется также.
#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
СРАВНЕНИЯ
#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
Какой из приведенных выше фрагментов кода предпочтительнее для запуска кода только при отладке и почему? Я предполагаю, что первая будет выполняться, если DEBUG определяется как TRUE или FALSE, где вторая будет работать только в том случае, если DEBUG определен и установлен в TRUE. Это правильно?
Ответы
Ответ 1
Вы правы. #if DEBUG
не будет оценивать, если DEBUG
определяется как 0
.
Что касается использования каждого из них, вы можете использовать #ifdef
для всего, где вам нужно только добавить код, если присутствует определение препроцессора, например добавление журнала отладки. Если вам нужно проверить значение и перейти по различным путям компиляции, я бы использовал 0
или 1
. Хорошим примером этого является TARGET_IPHONE_SIMULATOR
, который всегда определен для проекта iOS, но только 1
, если вы компилируете для симулятора.
Ответ 2
Как я знаю, лучший выбор:
#ifndef DEBUG
NSLog(@"-1");
#elif DEBUG == 0
NSLog(@"0");
#else
NSLog(@"%d", DEBUG);
#endif
тогда вы узнаете, что #ifndef DEBUG
предпочтительнее всех остальных.
Существует более простой выбор:
#if DEBUG == 0 // DEBUG is not defined or defined to be 0
// do sth
#else
// do sth
#endif
Однако, если флаг компилятора -Wundef включен, может быть предупреждение с #if DEBUG == 0
.
Ответ 3
Вам нужно посмотреть код, где DEBUG определяется или не определен, и, соответственно, написать свой код. С DEBUG вы обнаружите, что он либо не определен, либо определен со значением 1. Таким образом, будет работать либо #if
DEBUG, либо #ifdef
DEBUG.
Для #define
, которые находятся под вашим контролем, я рекомендую вам всегда определять их либо со значением 0 или 1. Затем вы можете использовать #if
для проверки значения, но вы также можете использовать их напрямую в обычном выражении if или в выражении, которое может сделать ваш код более удобочитаемым. И поскольку он всегда определен, вы можете использовать "Переход к определению" в Xcode, чтобы перейти к тому месту, где оно определено, и проверить, как и почему он установлен. Если вместо этого вы либо #define
, либо не #define
значение, и оно не определено, то Xcode не имеет понятия, где в исходном коде он не определен. Это также дает вам возможность искать применение с ошибками. Если "Перейти к определению" не работает, значит, вы знаете, что ошиблись.
BTW В директиве #if
любой макрос, который не определен, заменяется на 0. Итак #if
DEBUG будет работать, если DEBUG не определен или DEBUG определяется как 0, и он не будет компилироваться, если DEBUG определяется как ничто, что скажет вам, что не так, и вы можете это исправить. С этой точки зрения использование #if
лучше, если оно не компилируется.