3

C++ Primer 说

assert 的行为取决于名为 NDEBUG 的预处理器变量的状态。#define我们可以通过提供一个定义 来“关闭”调试NDEBUG

我的期望是在提供定义时,不会执行断言。

#define NDEBUG TRUE

int main (int argc, char const *argv[])
{
    assert(argc==0);  // checked

    return 0;
}

在这个例子中,为什么要assert检查语句,何时NDEBUG定义?(如果我错了,请纠正我,但这与它的定义无关,对吧?)

从命令行执行时,使用-DNDEBUG标志,所有工作都按预期工作(assert不执行)

4

1 回答 1

10

NDEBUG仅影响assert在包含之前定义它<cassert>(或<assert.h>;请注意,您可以包含这些标头多次更改assert取决于的行为NDEBUG)。

您不需要将其定义为任何特定值,或者根本不需要任何值:

// this is OK
#define NDEBUG
于 2012-09-02T16:41:33.327 回答