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