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