Откуда обычно берется -DNDEBUG?

Наша система сборки каким-то образом изменилась, так что оптимизированные сборки больше не добавляют -DNDEBUG в строку компиляции. Я искал наши make-файлы и не нашел этого.

Итак, вопрос в том, откуда взялся -DNDEBUG для большинства людей и как это могло измениться? Раньше у нас был -DNDEBUG, и я не думаю, что он был удален ни из одного из наших make-файлов.

Спасибо.

-Уильям


person WilliamKF    schedule 10.12.2009    source источник
comment
может захотеть проверить ваш configure или configure.ac, если вы используете инструменты сборки GNU, т. е. autoconf и др.   -  person Anycorn    schedule 10.12.2009
comment
Я не использую конфиг, только make-файлы GNU.   -  person WilliamKF    schedule 10.12.2009


Ответы (3)


Поскольку компилятор не может сам решать, когда добавлять определение NDEBUG, а когда нет, флаг всегда устанавливается либо в make-файле, либо в файле проекта (в зависимости от вашей системы сборки).

person Tal Pressman    schedule 10.12.2009

На это действительно сложно ответить, поскольку вы не указали используемую систему сборки. Если вы используете autoconf, то ожидается, что либо пользователь поместит -DNDEBUG в CPPFLAGS вручную (или, возможно, вы устанавливали его из файла CONFIG_SITE, который изменился), либо configure.ac может настроить пользовательскую переменную для установки NDEBUG. , или configure.ac может вызвать AC_HEADER_ASSERT, и в этом случае добавление --disable-assert к вызову configure определит NDEBUG в config.h. Есть много способов, как это может произойти.

person William Pursell    schedule 10.12.2009
comment
Если мне нужно выбрать между выполнением AC_DEFINE(NDEBUG,[],[]) и CPPFLAGS="$CPPFLAGS -DNDEBUG" в configure.ac, что мне делать? Является ли недостатком #define NDEBUG в config.h? Если я сделаю и то, и другое, я получу много предупреждений о дублировании определений NDEBUG, которых я хотел бы избежать. - person peschü; 16.04.2017
comment
Если вы поддерживаете файлы метаданных autoconf, вы должны использовать AC_HEADER_ASSERT и позволить пользователю указать --disable-assert во время настройки. Пользователь несет ответственность за передачу -DNDEBUG компилятору, если он того пожелает. Не следует определять NDEBUG по умолчанию; это не прерогатива сопровождающего пакета. - person William Pursell; 17.04.2017
comment
Что, если -DNDEBUG не включен по умолчанию, а включен опцией --enable-release? Будет ли это уместно? И как мне активировать -DNDEBUG в этом случае? - person peschü; 17.04.2017
comment
Что касается --enable-release, пожалуйста, прочитайте stackoverflow.com/ вопросы/4553735/ - person William Pursell; 17.04.2017

По моему опыту, -DNDEBUG передается вручную, т. е. make-файлы написаны таким образом, что флаг передается при сборке в режиме выпуска.

person Zach Hirsch    schedule 10.12.2009