Я прочитал в тексте, что размещение следующей строки препроцессора игнорирует все последующие директивы assert препроцессора. Но, похоже, это не сработает, и заражение оператора assert обрабатывается препроцессором и прерывает программу, когда условие в assert не удовлетворено (я знаю, что прерывание — это правильное поведение, когда условие assert не выполнено). Мой вопрос: почему утверждение assert не игнорируется путем размещения #define NDEBUG. Код
#include<stdio.h>
#include<assert.h>
#define NDEBUG
int main(){
int x = 0;
assert (x!=0);
}
Измените порядок появления, тогда оно должно работать:
#define NDEBUG
#include<assert.h>
NDEBUG
используется для определения assert()
макрос в <assert.h>
условно.
Определяет не работает, как это. Вы должны определить свой NDEBUG до в том числе assert.h
Это происходит потому, что внутри assert.h
NDEBUG проверяется с помощью #ifdef
:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
//....
NDEBUG
должен появиться до включения заголовка. Это точно указано в стандарте.
Заголовок определяет
assert
а такжеstatic_assert
макросы и
относится к другому макросу,NDEBUG
который не определяется
<assert.h>
Если
NDEBUG определяется как имя макроса в точке исходного файла
где<assert.h>
макрос assert определяется просто как#define assert(ignore) ((void)0)**
Макрос assert переопределяется в соответствии с текущим состоянием NDEBUG каждый раз, когда
включен.
от N1570, акцент мой.
Все предыдущие ответы верны.
Но assert не предназначены для использования путем добавления #define NDEBUG
в исходном коде.
Канонический способ:
1) Использование #include <assert.h>
и позвонить assert()
в вашем коде.
2) Затем во время сборки:
2а) gcc blablabla
: это отлаживать build, NDEBUG не определен, а assert () вступает в действие.
2b) gcc blablabla -DNDEBUG blablabla
: это производство build, NDEBUG определен, assert () ничего не делает.
Утверждения — это способ обнаружить ошибки / исключительные условия в время разработки. NDEBUG можно записать как «NOT_DEBUG».
Другой способ, добавить определение в CMakeLists.txt звучит неплохо.
set(release 1)
if (release)
add_definitions(-DNDEBUG)
endif ()
просто set(release 0)
если вы отлаживаете, и set(release 1)
когда релиз
Это удобнее и удобочитаемее.