[英]The #define NDEBUG doesn't seem to work
我在文中读到放置以下预处理器行忽略所有后续的断言预处理器指令。 但这似乎不起作用,并且assert语句infact由预处理器处理,并且当断言中的条件不满足时中止程序(我知道在不满足断言条件时abort是正确的行为)。 我的问题是为什么放置#define NDEBUG不会忽略断言语句。 代码是
#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.h 之前定义你的NDEBUG
发生这种情况是因为在assert.h
使用#ifdef
检查了NDEBUG:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
//....
NDEBUG
必须在包含标头之前出现。 这在标准中有详细说明。
头定义了
assert
和static_assert
宏并引用了另一个宏,NDEBUG
它不是由
<assert.h>
定义的如果NDEBUG被定义为源文件中包含<assert.h>
的点的宏名称,则断言宏被简单地定义为#define assert(ignore) ((void)0)**
断言宏根据每次包含的NDEBUG的当前状态重新定义。
来自N1570,强调我的。
之前的所有答案都是正确的
但是,断言并不意味着在源代码中添加#define NDEBUG
。
规范方式:
1)使用#include <assert.h>
并在代码中调用assert()
。
2)然后在构建时:
2a) gcc blablabla
:这是一个调试版本,没有定义NDEBUG,并且assert()付诸行动。
2b) gcc blablabla -DNDEBUG blablabla
:这是一个生产版本,定义了NDEBUG,assert()什么都不做。
断言是一种在开发时发现错误/异常情况的方法。 NDEBUG可以拼写为“NOT_DEBUG”。
另一种方法,在CMakeLists.txt中添加定义听起来不错。
set(release 1)
if (release)
add_definitions(-DNDEBUG)
endif ()
如果你调试就set(release 0)
,并在发布时set(release 1)
它更方便,更易读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.