#define NDEBUG似乎无法正常工作

时间:2015-09-09 10:11:03

标签: c++ assert stdio abort

我在文中读到放置以下预处理器行忽略了所有后续的断言预处理器指令。但这似乎不起作用,并且assert语句infact由预处理器处理,并在断言中的条件不满足时中止程序(我知道当断言条件不满足时abort是正确的行为) 。我的问题是为什么放置#define NDEBUG不会忽略断言语句。代码是

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

int main(){
    int x = 0;

    assert (x!=0);  

}

4 个答案:

答案 0 :(得分:4)

更改外观顺序,然后它应该有效:

#define NDEBUG
#include<assert.h>

NDEBUG用于有条件地定义assert()中的<assert.h>宏。

答案 1 :(得分:1)

定义不会像这样工作。你应该在之前定义你的NDEBUG ,包括assert.h

发生这种情况是因为assert.h内部使用#ifdef检查了NDEBUG:

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

答案 2 :(得分:1)

NDEBUG必须在包含标题之前出现。这在标准中有详细规定。

  

标头定义了assertstatic_assert宏   指的是另一个宏,

     NDEBUG 
     

未由<assert.h> If定义   NDEBUG被定义为源文件中的宏名称   其中包含<assert.h>,断言宏仅定义为

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

每次都根据NDEBUG的当前状态重新定义断言宏   包括在内。

从N1570开始,强调我的。

答案 3 :(得分:0)

另一种方法,在CMakeLists.txt中添加定义听起来不错。

set(release 1)

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

set(release 0)仅用于调试,set(release 1)则用于发布

它更方便易读。