Кажется, #define NDEBUG не работает

Я прочитал в тексте, что размещение следующей строки препроцессора игнорирует все последующие директивы assert препроцессора. Но, похоже, это не сработает, и заражение оператора assert обрабатывается препроцессором и прерывает программу, когда условие в assert не удовлетворено (я знаю, что прерывание — это правильное поведение, когда условие assert не выполнено). Мой вопрос: почему утверждение assert не игнорируется путем размещения #define NDEBUG. Код

#include<stdio.h>
#include<assert.h>
#define NDEBUG

int main(){
int x = 0;

assert (x!=0);

}

2

Решение

Измените порядок появления, тогда оно должно работать:

#define NDEBUG
#include<assert.h>

NDEBUG используется для определения assert() макрос в <assert.h> условно.

4

Другие решения

Определяет не работает, как это. Вы должны определить свой NDEBUG до в том числе assert.h

Это происходит потому, что внутри assert.h NDEBUG проверяется с помощью #ifdef:

#ifdef  NDEBUG
# define assert(expr)           (__ASSERT_VOID_CAST (0))
#else
//....
1

NDEBUG должен появиться до включения заголовка. Это точно указано в стандарте.

Заголовок определяет assert а также static_assert макросы и
относится к другому макросу,

     NDEBUG

который не определяется <assert.h> Если
NDEBUG определяется как имя макроса в точке исходного файла
где <assert.h> макрос assert определяется просто как

     #define assert(ignore) ((void)0)**

Макрос assert переопределяется в соответствии с текущим состоянием NDEBUG каждый раз, когда
включен.

от N1570, акцент мой.

1

Все предыдущие ответы верны.

Но 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».

1

Другой способ, добавить определение в CMakeLists.txt звучит неплохо.

set(release 1)

if (release)
add_definitions(-DNDEBUG)
endif ()

просто set(release 0) если вы отлаживаете, и set(release 1) когда релиз

Это удобнее и удобочитаемее.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector