Почему NDEBUG вместо RELEASE? - PullRequest
       6

Почему NDEBUG вместо RELEASE?

11 голосов
/ 10 февраля 2012

Стандартный макрос C assert отключен, если макрос NDEBUG определен, что означает «Не отлаживать». Это приводит к действительно ужасным двойным негативным случаям, таким как #ifndef NDEBUG //DebuggingCode #endif. Кажется, что RELEASE был бы лучшим выбором терминов, но я не могу поверить, что комитет по стандартам сделал бы это так без какой-либо причины ...

Ответы [ 4 ]

6 голосов
/ 10 февраля 2012

Макрос NDEBUG контролирует поведение assert.

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

Я бы порекомендовал вам определить свой собственный символ препроцессора, скажем, MY_TRACE, и использовать его. Кроме того, определите его как 0 или 1 и используйте #if MY_TRACE. Таким образом, вы можете перехватывать файлы, используя символ без надлежащей инициализации, если вы настроите свой компилятор на выдачу предупреждения при использовании неинициализированной переменной в выражении препроцессора.

5 голосов
/ 10 февраля 2012

Наличие макроса RELEASE означает, что код готов к распространению, а может и нет.NDEBUG, с другой стороны, подразумевает, что отладка завершена, и, следовательно, готова к тестированию.

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

Только мои скромные мысли.

3 голосов
/ 11 февраля 2012

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

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

0 голосов
/ 17 февраля 2015

Как долгосрочный пользователь Eiffel, я могу сказать вам, что он используется не так, как debug / nodebug. Как уже указывалось, единственный эффект - отключение операторов assert. Цель assert состоит в том, чтобы добавить проверки до и после условия. Рекомендуется интенсивное его использование, и оно может снизить производительность вашей программы в 10 и более раз. Это называется «дизайн для бедных» по контракту.

При использовании NDEBUG это вовсе не означает, что вы закончили с отладкой, просто это тяжелое средство отладки удалено.

Популярная версия Debug / Release, к сожалению, не лучший пример для практической разработки, когда у вас есть веские причины поразмышлять над моделью выпуска Alpha, Beta, Release.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...