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

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

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

ПРОТИВ

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif

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

3 ответа

Решение

Ты прав. #if DEBUG не будет оценивать, если DEBUG определяется как 0,

Что касается того, когда использовать каждый, вы можете придерживаться использования #ifdef для всего, что вам нужно только добавить код, если присутствует определение препроцессора, например, добавление журнала отладки. Если вам нужно проверить значение и пойти по разным путям компиляции, то я бы использовал 0 или же 1, Хороший пример тому TARGET_IPHONE_SIMULATOR, который всегда определяется для проекта iOS, но только 1 если вы компилируете для симулятора.

Как я знаю, лучший выбор:

#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,

Вам нужно посмотреть на код, где DEBUG определен или не определен, и написать свой код соответственно. С DEBUG вы обнаружите, что он либо не определен, либо определен со значением 1. Так что либо #if ОТЛАДКА или #ifdef DEBUG будет работать.

За #defineНаходящиеся под вашим контролем, я рекомендую всегда определять их со значением 0 или 1. Затем вы можете использовать #if для проверки значения, но вы также можете использовать их непосредственно в обычном операторе if или в выражении, что может сделать ваш код более читабельным. И так как это всегда определено, вы можете использовать "Перейти к определению" в XCode, чтобы перейти к месту, где оно определено, и проверить, как и почему оно установлено. Если вместо этого вы либо #define или нет #define значение, а оно не определено, тогда Xcode не будет знать, где в вашем исходном коде оно не определено. Это также дает вам возможность искать варианты с ошибками. Если "Перейти к определению" не работает, то вы знаете, что написали неправильно.

Кстати, в течение #if директива, любой макрос, который не определен, заменяется на 0. Итак #if DEBUG будет работать, если DEBUG не определен, или если DEBUG определен как 0, и не будет компилироваться, если DEBUG определен как ничего - что скажет вам, что не так, чтобы вы могли это исправить. С этой точки зрения, используя #if лучше, если он не компилируется.

Другие вопросы по тегам