繁体   English   中英

#define NDEBUG似乎不起作用

[英]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必须在包含标头之前出现。 这在标准中有详细说明。

头定义了assertstatic_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM