Подтвердить что ты не робот

#ifdef DEBUG против #if DEBUG

Мне непонятно, когда используются директивы компилятора, какие из приведенных ниже двух фрагментов кода являются правильными/предпочтительными и почему. Похоже, что большинство разработчиков и проекты с открытым исходным кодом, которые я видел, используют первый, но я видел, что второй часто используется также.

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

СРАВНЕНИЯ

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

Какой из приведенных выше фрагментов кода предпочтительнее для запуска кода только при отладке и почему? Я предполагаю, что первая будет выполняться, если DEBUG определяется как TRUE или FALSE, где вторая будет работать только в том случае, если DEBUG определен и установлен в TRUE. Это правильно?

4b9b3361

Ответ 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 лучше, если оно не компилируется.