Ответ 1
Поскольку компилятор не может самостоятельно решить, когда нужно добавить определение NDEBUG, а когда это не так, флаг всегда задается либо файлом makefile, либо файлом проекта (в зависимости от вашей системы сборки).
Наша система сборки каким-то образом изменилась так, что оптимизированные сборки больше не добавили -DNDEBUG в строку компиляции. Я искал наши make файлы и не нашел этого.
Итак, вопрос в том, где -DNDEBUG возникает для большинства людей и как это могло измениться? Раньше у нас было -DNDEBUG, и я не думаю, что это было удалено из любого из наших make файлов.
Спасибо.
-William
Поскольку компилятор не может самостоятельно решить, когда нужно добавить определение NDEBUG, а когда это не так, флаг всегда задается либо файлом makefile, либо файлом проекта (в зависимости от вашей системы сборки).
На самом деле это сложно ответить, поскольку вы не указали используемую систему сборки. Если вы используете autoconf, то либо пользователь должен поместить -DNDEBUG в CPPFLAGS вручную (или, возможно, вы установили его из файла CONFIG_SITE, который был изменен), либо configure.ac может настроить пользовательскую переменную для установки NDEBUG, или configure.ac может вызывать AC_HEADER_ASSERT, и в этом случае добавление -disable-assert к вызову configure определит NDEBUG в config.h. Есть много способов, которыми это может случиться.
По моему опыту, -DNDEBUG был передан вручную, т.е. make файлы были написаны таким образом, что флаг передается при создании в режиме выпуска.