2012-05-31 3 views
9

Я работаю на C++ программа построена другими людьми, и видел много использования DEBUG как этотВ чем причина использования макроса DEBUG в C++?

#ifdef DEBUG 
    cout << "Value is "<< value << endl; 
#endif 

Я сам до сих пор в процессе обучения, чтобы стать богатым C++ программист, и я главно использование Visual Studio и точки останова для отладки. Поэтому мне интересно, если я смогу выполнить код для отладки значений, есть ли другая причина использовать эти макросы?

Пробовал Google, но не нашел много полезной страницы.

Спасибо.

+0

, когда ответ на самом деле предоставляет вам (лучшее) решение вашей проблемы, вы можете нажать на большой V рядом с ним, чтобы принять его. – KillianDS

ответ

10

Иногда вы не хотите проходить весь код, а просто проверяете вывод в терминале.

Если код скомпилирован с DEBUG, определенным, вероятно, в сборке отладки, вы видите результат. Для сборки релиза вы этого не делаете. Если вы перейдете на параметры проекта -> Свойства конфигурации -> C/C++ -> Препроцессор -> Определения препроцессора, вы увидите, что для сборки отладки определен DEBUG, но это не для выпуска. (У меня действительно есть _DEBUG)

Представьте, что у вас есть огромная функция, и что вас интересует на 1000-й строке (это старый код, он не может его изменить). Вы предпочли бы пройти весь этот грязный код устаревшего кода или иметь полезные отладочные заявления в ключевых точках? Вы предпочли бы, чтобы консоль сообщила вам, где что-то пошло не так, или установите точки останова в каждом из операторов 237 return в местах сбоя?

+0

Это хороший момент. Благодарю. – Derek

+3

Я хотел бы добавить, что '_DEBUG' специфичен для Visual C++. Проверьте [Включение функций отладки в Visual C++] (http://msdn.microsoft.com/en-us/library/5bb575z2.aspx?ppud=4) – LihO

+0

спасибо за информацию @LihO – Derek

1

Это для отладки, обернув код в командах препроцессора, вы можете включить или выключить этот код.

Посмотрите здесь: C++ Notes: Preprocessor

6

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

Необходимость «отладки текстового режима» и ведения журналов также часто происходит из опыта встроенных систем, где у вас нет большой наглядной помощи, и все, что вы можете сделать, это сбросить байт или два в последовательный порт или что-то еще как это. Когда вы привыкнете быстро находить критические точки отладки, вы просто вставляете там какой-то код печати, чье значение проверяет правильность программы.

Макрос «DEBUG» определяется компилятором MSVC++, в то время как ваш проект скомпилирован в режиме отладки. Когда вы делаете версию Release, весь код, который на самом деле бесполезен для конечных пользователей, «убирается» препроцессором.

Типичный фрагмент

#ifdef DEBUG 
Some code 
#endif 

удаляется препроцессором, если ОТЛАДКА не определен.

1

Легко, если вы хотите получить сообщения, которые могут помочь вам сделать «мягкий» отладчик, вы просто определяете DEBUG, и предложения между #ifdef DEBUG и #endif будут иметь эффект, а в вашем случае получите полезные сообщения.

Таким образом, когда вы закончите разработку, и вы хотите сделать выпуск, вы просто отмените отладку, и сообщения больше не появятся.

Вы можете подумать, что это хорошая идея, но это скорее код для приложения, но хороший момент в том, что это макросы и оцениваются во время компиляции, поэтому приложение будет таким же, что и при удалении все из них :)

2

«Я главно использовать Visual Studio и точки останова для отладки»
Отладка кода, наблюдая за его поведением шаг за шагом довольно трудно или даже невозможно в некоторых ситуациях. Иногда проще создать такой «отладочный вывод», чтобы вы видели, что происходит из этих журналов, вместо того, чтобы пытаться пройти через него в реальном времени.

Проверка того, установлен ли символ DEBUG, чтобы убедиться, что ваша версия выпуска не производит такой вид вывода. Обратите внимание, что Visual Studio определяет _DEBUG для конфигурации отладки. Более конкретно: «Компилятор определяет _DEBUG, когда вы указываете параметр/MTd или/MDd. Эти параметры определяют версии отладки библиотеки времени выполнения C». Существует также NDEBUG, который отключает утверждения стиля C, если они определены. Для получения дополнительной информации проверьте _DEBUG vs NDEBUG.

3

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

0

Я бы рекомендовал не использовать макрос DEBUG. Вместо этого используйте стандартный макрос NDEBUG, который определяется, когда код отладки не нужен, а не определен, когда требуется отладочный код. То есть, отлаживать код активным по умолчанию. Вы обнаружите, что только небольшое ядро ​​критически важного кода производительности должно отключать отладочные проверки для обеспечения адекватной производительности.

+0

В вопросе SO [_DEBUG vs NDEBUG] (http://stackoverflow.com/questions/2290509/debug-vs-ndebug), а также [этот вопрос SO] (http://stackoverflow.com/questions/5473556/what-is-the-ndebug-preprocessor-macro -used-for-on-different-platform) использование «NDEBUG» для чего-либо другого, кроме управления поведением утверждений, не рекомендуется. Причина в том, как можно разрешить неопределенное/переопределенное «NDEBUG» произвольно. – herzbube

Смежные вопросы