DEBUG vs NDEBUG



какой препроцессор следует использовать для указания отладочных разделов кода?



использовать #ifdef _DEBUG или #ifndef NDEBUG или есть ли лучший способ сделать это, например,#define MY_DEBUG?



Я думаю _DEBUG - это конкретные визуальные студии, NDEBUG стандарт?

753   6  

6 ответов:

Visual Studio определяет _DEBUG если указать /MTd или , NDEBUG отключает стандартные утверждения-C. Используйте их при необходимости, т. е. _DEBUG Если вы хотите, чтобы ваш отладочный код в соответствии с методы отладки MS CRT и NDEBUG Если вы хотите быть последовательным с assert().

если вы определяете свои собственные макросы отладки (и вы не взламываете компилятор или среду выполнения C), избегайте запуска имен с подчеркиванием, так как это зарезервированный.

Я опираюсь на NDEBUG, потому что это единственный, чье поведение стандартизировано между компиляторами и реализациями (см. документацию для стандартного макроса assert). Отрицательная логика-это небольшая скорость чтения, но это общая идиома, к которой вы можете быстро адаптироваться.

полагаться на что-то вроде _DEBUG будет полагаться на детали реализации конкретного компилятора и реализации библиотеки. Другие компиляторы могут выбрать или не выбрать то же самое конвенция.

третий вариант-определить свой собственный макрос для вашего проекта, что вполне разумно. Наличие собственного макроса обеспечивает переносимость между реализациями и позволяет включать или отключать отладочный код независимо от утверждений. Хотя, в общем, я не советую иметь разные классы отладочной информации, которые включены во время компиляции, так как это приводит к увеличению количества конфигураций, которые вы должны построить (и протестировать) для возможно, небольшая выгода.

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

является ли ndebug стандартным?

Да это стандартный макрос с семантическим "не отлаживать" для стандартов C89, C99, C++98, C++2003, C++2011, c++2014. Нет никаких _DEBUG макросы в стандартах.

стандарт C++2003 отправить читателя на "странице 326" в " 17.4.2.1 заголовки" до стандарта С.

что NDEBUG похож, так как это то же самое, что и стандартная библиотека C.

в C89 (программисты C назвали этот стандарт как стандарт C) в разделе" 4.2 диагностика " было сказано

http://port70.net / ~nsz/c/c89/c89-draft.html

если NDEBUG определяется как имя макроса в точке исходного файла где включен, макрос assert определяется просто как

     #define assert(ignore) ((void)0)

если посмотреть на смысл _DEBUG макросы в Visual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx тогда будет видно, что это макрос автоматически определяется выбором версии библиотеки времени выполнения языка.

макрос NDEBUG определяет, активны ли операторы assert ().

на мой взгляд, это отдельно от любой другой отладки - поэтому я использую что-то другое, чем NDEBUG для управления отладочной информацией в программе. То, что я использую, зависит от структуры, с которой я работаю; разные системы имеют разные макросы включения, и я использую все, что подходит.

Если нет фреймворка, я бы использовал имя без ведущего подчеркивания; те, как правило, зарезервировано для "реализации", и я стараюсь избегать проблем с коллизиями имен - вдвойне, когда имя является макросом.

будьте последовательны, и это не имеет значения, какой из них. Также, если по какой-то причине вы должны взаимодействовать с другой программой или инструментом, используя определенный идентификатор отладки, это легко сделать

#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa

к сожалению, "отладка" сильно перегружена. Например, рекомендуется всегда создавать и сохранять pdb-файл для сборки выпуска. Что означает один из флагов-Zx и параметр компоновщика-DEBUG. В то время как _DEBUG относится к специальным отладочным версиям библиотеки времени выполнения, таким как вызовы malloc и free. Затем NDEBUG отключит утверждения.

Comments

    Ничего не найдено.