Linux和Windows中的assert断言

2019-04-16  本文已影响0人  不爱钱的张师傅

今天在查看 bind 源码的时候,遇到断言。感觉熟悉,却记不清具体作用了。仔细想想,发现自己似乎从来没有用过。

因为一般在 windows系统的 VS 或 VC  中写 C 代码的时候,都可以直接调试看变量的值,不需要靠断言来查错。而在 linux 下开发,因为调试不方便,写断言更划算。

1. assert的样子:    assert(表达式);

 表达式不为真,则中断程序运行。

优点:简洁。比写个 if 语句做判断更简洁。

缺点:要不是没有更好的东西替代,我要用它吗!还要什么缺点?!还要啥自行车?!没有缺点!

2. assert在 win 和 linux 下,没有什么不同。但是在使用上,在 Release 版本的时候,linux 需要手动去配置宏定义,使断言失效。 win 下,在 IDE  配置一下就好。

win下这样就行了

 linux下,需要定义一个宏 NDEBUG ,即 非调试模式

#ifndef DEBUG

#define NDEBUG

#endif

3. assert使用举例:

windows系统下:

Debug模式 windows系统调用assert

在 DEBUG 模式下,上面代码由于 flag = false;所以 assert(false) 断言

2. assert只在 Debug 模式下可用,而 Release 时失效。毕竟断言一般会写很多,很浪费时空。

Release模式

 同一段代码改成 Release 模式,运行如下:

断言失效

原因在于assert.h源码中定义如下:

NDEBUG 即 非调试模式。也就是 Release 模式。Release 模式,则将断言定义为 (void(0)),相当于 NULL;

3.  Linux 的 assert.h 也是一样:

查看Linux下的assert.h

相同代码在 Linux 执行:

Linux下assert执行

接着我们加上 NDEBUG 的宏,注意要写在#include <assert.h> 前面(你另写一个 .h 在其中包含 assert.h 也行,但NDEBUG一样要写在前面):

Linux下的 Release 版本

所以,在 Linux 下,要使断言无效,需要自己手动添加宏定义来实现哦~, 这就是 没有 IDE 的坏处啦,什么都要自己配置。

如果觉得有帮助,就笑一个。

上一篇下一篇

猜你喜欢

热点阅读