Для чего используется макрос препроцессора NDEBUG (на разных платформах)? - PullRequest
36 голосов
/ 29 марта 2011

Меня интересует, для чего различные платформы / компиляторы ("реализации") / фреймворки назначают макросу препроцессора C и C ++ NDEBUG.

C , а также стандарт C ++ упоминают это определение только один раз, а именно, для управления поведением макроса assert().

Я бы попросил включить только конкретные ответы, где вы знаете , что определенная платформа / инфраструктура / библиотека для C или C ++ использует определение NDEBUG для включения или отключения чего-либо иначе в дополнение к стандартному определенному assert() макросу .

Одной из причин для того, чтобы задать этот вопрос, было то, что MS (Visual-C ++) всегда (?) Использует «свои» _DEBUG определения, чтобы различать вещи отладки и выпуска, и мне было интересно, если это распространенная практика для библиотеки / платформы иметь свое "собственное" определение отладки или другие библиотеки / платформы используют NDEBUG для своих вещей, связанных с отладкой.

Ответы [ 2 ]

27 голосов
/ 29 марта 2011

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

Обратите внимание, что вы также можете изменить состояние макроса NDEBUG в единице перевода (исходный файл), используя #define и / или #undefна NDEBUG и включите assert.h, чтобы изменить поведение макроса assert (включите и выключите его).Такое поведение предписано стандартом и является единственным случаем (я думаю), когда стандарт позволяет включать стандартный заголовок во второй раз для изменения поведения компиляции после второго включения.

22 голосов
/ 29 марта 2011

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

При этом, используя NDEBUG в заголовках библиотеки / фреймворка, для всего остального , но assert(), было бы довольно глупым дизайнерским решением.Программисту приложения явно разрешено устанавливать / отменять NDEBUG, однако он считает нужным, до и / или после включения заголовков любой библиотеки или фреймворка, поэтому сопровождающий lib / framework не может полагаться на то, что NDEBUG установлен длярелизная библиотека или не установлена ​​для отладочной библиотеки.Я сомневаюсь, что какой-либо значительный проект мог бы полагаться на NDEBUG таким образом.

...