Ответ 1
Вы должны #define NDEBUG
(или использовать флаг -DNDEBUG
с g++), это отключит assert, если оно определено до включения файла заголовка assert.
У меня есть код, полный вызова assert(condition)
.
В отладочной версии я использую g++ -g
, используя мое утверждение.
С удивлением я вижу, что утверждение также работает в моей версии релиза, скомпилированной без опции -g
.
Как я могу полностью отключить во время компиляции мое утверждение? Должен ли я явно определять NDEBUG
в любой сборке, которую я создаю, несмотря на то, что они отлаживаются, освобождаются или что-то еще?
Вы должны #define NDEBUG
(или использовать флаг -DNDEBUG
с g++), это отключит assert, если оно определено до включения файла заголовка assert.
Используйте #define NDEBUG
7.2 Диагностика
1 Заголовок определяет макрос assert и ссылается на другой макрос,
NDEBUG
который не определен
<assert.h>
. Если NDEBUG определяется как имя макроса в точке исходного файла, где он включен, определяется макрос assertпросто как
#define assert(ignore) ((void)0)
Макрос assert переопределяется в соответствии с текущим состоянием NDEBUG каждый раз, когда
<assert.h>
.
Вы можете полностью отключить утверждения с помощью
#define NDEBUG
#include <assert.h>
или вы можете установить NDEBUG (через -DNDEBUG) в своей процедуре makefile/build в зависимости от того, хотите ли вы продуктивную версию или версию dev.
Флаг -g
не влияет на работу assert
, он просто обеспечивает доступность различных отладочных символов.
Настройка NDEBUG
является стандартным (как в официальном стандарте ISO) способом отключения утверждений.
Да, определите NDEBUG
в командной строке/системе сборки с опцией препроцессора/компилятора -DNDEBUG
.
Это не имеет ничего общего с информацией об отладке, вставленной -g
.