我在一篇文章中读到,放置以下预处理器行会忽略所有后续的 assert 预处理器指令。但这似乎不起作用,并且断言语句实际上由预处理器处理并在断言中的条件不满足时中止程序(我知道当断言条件不满足时中止是正确的行为)。我的问题是为什么通过放置#define NDEBUG 不会忽略断言语句。代码是
#include<stdio.h>
#include<assert.h>
#define NDEBUG
int main(){
int x = 0;
assert (x!=0);
}
Run Code Online (Sandbox Code Playgroud)
更改外观顺序,然后它应该可以工作:
#define NDEBUG
#include<assert.h>
Run Code Online (Sandbox Code Playgroud)
NDEBUG用于有条件地定义assert()宏<assert.h>。
以前的所有答案都是正确的。
#define NDEBUG但断言并不意味着通过在源代码中添加来使用。
规范的方式:
1)使用#include <assert.h>并调用assert()您的代码。
2)然后在构建时:
2a) gcc blablabla:这是一个调试版本,NDEBUG 未定义,assert() 开始执行。
2b) gcc blablabla -DNDEBUG blablabla:这是一个生产版本,定义了 NDEBUG,assert() 不执行任何操作。
断言是在开发时发现错误/异常情况的一种方法。NDEBUG 可以拼写为“NOT_DEBUG”。
定义不是这样工作的。你应该在包含assert.h之前定义你的NDEBUG
发生这种情况是因为在assert.hNDEBUG 内部使用以下命令进行检查#ifdef:
#ifdef NDEBUG
# define assert(expr) (__ASSERT_VOID_CAST (0))
#else
//....
Run Code Online (Sandbox Code Playgroud)