我在文中读到放置以下预处理器行忽略了所有后续的断言预处理器指令。但这似乎不起作用,并且assert语句infact由预处理器处理,并在断言中的条件不满足时中止程序(我知道当断言条件不满足时abort是正确的行为) 。我的问题是为什么放置#define NDEBUG不会忽略断言语句。代码是
#include<stdio.h>
#include<assert.h>
#define NDEBUG
int main(){
int x = 0;
assert (x!=0);
}
答案 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
必须在包含标题之前出现。这在标准中有详细规定。
从N1570开始,强调我的。标头定义了
assert
和static_assert
宏 指的是另一个宏,NDEBUG
未由
<assert.h>
If定义 NDEBUG被定义为源文件中的宏名称 其中包含<assert.h>
,断言宏仅定义为#define assert(ignore) ((void)0)**
每次都根据NDEBUG的当前状态重新定义断言宏 包括在内。
答案 3 :(得分:0)
另一种方法,在CMakeLists.txt中添加定义听起来不错。
set(release 1)
if (release)
add_definitions(-DNDEBUG)
endif ()
set(release 0)
仅用于调试,set(release 1)
则用于发布
它更方便易读。