我在一个文本中读到放置以下预处理器行会忽略所有后续断言预处理器指令。但是这似乎不起作用,而且断言语句实际上是由预处理器处理的,当断言条件不满足时,它会中止程序(我知道当断言条件不满足时,中止是正确的行为)。我的问题是为什么没有通过放置#define NDEBUG来忽略assert语句。代码是
#include<stdio.h>
#include<assert.h>
#define NDEBUG
int main(){
int x = 0;
assert (x!=0);
}
改变出现的顺序,然后它应该工作:
#define NDEBUG
#include <assert.h>
NDEBUG
用于有条件地定义<assert.h>
中的assert()
宏。
前面的答案都是正确的。
但是assert不能通过在源代码中添加#define NDEBUG
来使用。
规范方式:
1)在代码中使用#include <assert.h>
并调用assert()
。
2)然后在构建时:
2a) gcc blablabla
:这是一个调试构建,NDEBUG没有定义,并且assert()开始操作。
2b) gcc blablabla -DNDEBUG blablabla
:这是一个生产构建,定义了NDEBUG, assert()不做任何事情。
定义不是这样工作的。你应该在之前定义NDEBUG ,包括assert.h
发生这种情况是因为在assert.h
中使用#ifdef
检查NDEBUG:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
//....
NDEBUG
必须出现在标题之前。
头文件定义了
assert
和static_assert
宏和引用另一个宏NDEBUG
没有被
<assert.h>
If定义NDEBUG在源文件中被定义为宏名在包含<assert.h>
的地方,assert宏被简单地定义为#define assert(ignore) ((void)0)**
assert宏是根据NDEBUG的当前状态重新定义的包括在内。
来自N1570,强调我的
另一种方法,在CMakeLists.txt中添加定义听起来不错。
set(release 1)
if (release)
add_definitions(-DNDEBUG)
endif ()
在调试时是set(release 0)
,在释放时是set(release 1)
。