Использование защиты препроцессора, безусловно, является наиболее гибким и распространенным подходом. Однако, когда это возможно, я предлагаю использовать оператор if. Например, вместо
void example(int a){
int some_local;
...
#ifdef _DEBUG
std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
#endif
....
}
Предполагая, что ENABLE_DEBUG определен как 0 или ненулевое значение, я бы использовал
void example(int a){
int some_local;
...
if(ENABLE_DEBUG) std::cout << "In function " << __FUNCTION__ << "(" << a <<")" << std::endl;
...
}
Поскольку ENABLE_DEBUG является константой, когда ENABLE_DEBUG равен 0, компилятор не будет генерировать код для охраняемых им операторов. Итак, зачем использовать этот метод вместо #ifdef?
- Если в коде много отдельных операторов отладки, его может быть немного легче читать.
- Что еще более важно, код всегда обрабатывается на наличие синтаксических ошибок, даже если код не генерируется. Это может быть очень полезно, если код отладки включается нечасто. Если переменные изменяются (например, в приведенном выше примере, если аргумент a был переименован), то человек, делающий изменение, будет знать, что он также должен обновить оператор отладки. Если используются #ifdefs, то это может скрыть битовую гниль до тех пор, пока кому-то не понадобится включить код отладки, а затем им придется пойти и попытаться исправить код, что может быть для них неочевидным.
Очевидно, что этот подход работает только для операторов отладки внутри тел методов/функций.
person
TheDuke
schedule
22.01.2014
#ifdef TESTS
называется условной компиляцией. - person Grijesh Chauhan   schedule 21.01.2014#ifdef
(или#if defined
). Это плохой стиль, и граница полностью нарушена. Используйте#if
, а не#ifdef
. Причина в том, что#define IS_TEST_BUILD 0
должен делать то же самое, что и#undef IS_TEST_BUILD
, а не то же самое, что#define IS_TEST_BUILD 1
. - person Ben Voigt   schedule 22.01.2014