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