Подтвердить что ты не робот

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

Стандартный макрос макроса С отключается, когда макрос NDEBUG определен, что означает "Не отлаживать". Это приводит к действительно ужасным двойным отрицательным случаям, например, #ifndef NDEBUG //DebuggingCode #endif. Похоже, что RELEASE был бы лучшим выбором терминов, но я не могу поверить, что комитет по стандартизации сделал бы это так без всякой причины сделать это....

4b9b3361

Ответ 1

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

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

Просто мои скромные мысли.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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