_DEBUG vs NDEBUG

Какой препроцессор следует определять, чтобы указать разделы отладки кода?

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

Я думаю, что _DEBUG – это Visual Studio, является стандартом NDEBUG?

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

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

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

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

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

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

Стандарт NDEBUG?

Да, это стандартный макрос с семантическим «Not Debug» для C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014. В стандартах нет макросов _DEBUG .

Стандарт C ++ 2003 отправляет читателю на «страницу 326» в разделе «17.4.2.1 Заголовки» на стандарт C.

Этот NDEBUG похож на тот, что и на стандартную библиотеку C.

В C89 (программисты C назвали этот стандарт стандартом C) в разделе «4.2 DIAGNOSTICS» сказано

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, для управления отладочной информацией в программе. То, что я использую, зависит от структуры, с которой я работаю; разные системы имеют разные macros включения, и я использую все, что подходит.

Если нет frameworks, я бы использовал имя без главного подчеркивания; те, как правило, зарезервированы для «реализации», и я стараюсь избегать проблем с именами совпадений – вдвойне, когда имя является макросом.

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

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

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

  • Как вы отлаживаете React Native?
  • Каковы параметры командной строки Java, позволяющие удаленно отлаживать JVM?
  • Есть ли реальное решение для отладки приложений cordova
  • JavaScript console.log вызывает ошибку: «Синхронный XMLHttpRequest в основном streamе устарел ...»
  • Как определить, было ли приложение .NET скомпилировано в режиме DEBUG или RELEASE?
  • Перерыв при исключении исключения
  • Инструмент разработки Chrome: файл из javascript
  • Как программа C может выдать основной дамп без остановки?
  • Шаг в свойство / функцию (F11) не работает должным образом
  • Как отлаживать веб-сайты на мобильных устройствах?
  • Как отладить многопоточное приложение в IntelliJ?
  • Давайте будем гением компьютера.