Обычно я стараюсь избегать слишком частого использования условной компиляции, когда это возможно.
Во-первых, это обычно некрасиво и менее читабельно.
Но что еще более важно, когда проекты используют условную компиляцию для включения и выключения кода отладки, я иногда сталкиваюсь с проблемами, когда код отладки становится устаревшим, когда он отключен. Затем, когда я хочу использовать код для отладки, я включаю его и ... все. Не. Построить. Anymore.
Код отладки может ссылаться на переменные или функции, которые больше не существуют, или что-то вокруг скрытого кода отладки иным образом изменилось настолько, что это просто больше не синтаксически допустимо.
Это может быть очень раздражающим.
Итак, я лично избегал условной компиляции для включения / выключения кода отладки в пользу использования перечисления или макроса (который все еще условно компилируется) для использования в качестве условия в операторе if
. При компиляции как if (0)
код времени выполнения не генерируется - именно так, как требуется. Но код все еще компилируется и проверяется синтаксис, поэтому он всегда по крайней мере синтаксически корректен.
#if NDEBUG // using the same standard macro that `assert()` uses
// use your own if NDEBUG doesn't make sense
enum {
DebugOn = 0
}
#else
enum {
DebugOn = 1
}
#endif
// ... elsewhere
if (DebugOn) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Как упомянул FryGuy , вы можете легко комбинировать это с вызовом вашего MyFunction()
, если хотите - в сборке релиза функция не будет вызываться из-за короткого замыкания, каковым является ваше поведение Оговаривается:
if (DebugOn && MyFunction( expression)) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Но лично я бы, наверное, использовал
if (DebugOn) {
if (MyFunction( expression)) {
// ...
}
}
Что, я думаю, помогает немного яснее (чуть-чуть) сказать, что это блок только для отладки.
Это имеет то преимущество, что всегда компилируется и не имеет контроля потока, спрятанного за макросами (что несколько других ответов назвали злом).