NDEBUG #define 似乎不起作用
The #define NDEBUG doesn't seem to work
我在一个文本中读到放置以下预处理器行会忽略所有后续断言预处理器指令。但是这似乎不起作用,而且断言语句实际上是由预处理器处理的,当断言条件不满足时,它会中止程序(我知道当断言条件不满足时,中止是正确的行为)。我的问题是为什么没有通过放置#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)
。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 我可以将 #define 指令与 :: 一起使用吗?为什么它不起作用?
- NDEBUG #define 似乎不起作用