美文网首页
Linux和Windows中的assert断言

Linux和Windows中的assert断言

作者: 不爱钱的张师傅 | 来源:发表于2019-04-16 23:52 被阅读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 的坏处啦,什么都要自己配置。

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

相关文章

  • Linux和Windows中的assert断言

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

  • 断言NSAssert

    NSAssert与assert NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是...

  • NSAssert断言

    NSAssert与assert NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是...

  • Java陷阱之assert关键字

    一、概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用...

  • swift 自定义assert

    在Swift中,通过assert实现断言,assert可以帮助开发者比较容易的发现和定位错误一个断言断定条件是tr...

  • if与assert的区别

    assert 断言(assert)的语义: if 语义: 区别 1.assert语句仅仅在debug版本中才有效,...

  • 函数的使用

    Lua中,assert的作用Assert(断言)编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假...

  • Python的异常处理(三)

    assert 从上面的举例中可以基本了解了 assert 的特点。assert,翻译过来是“断言”之意。asser...

  • TestNG断言

    TestNG中的Assertion,也是断言。断言是测试中最难写的部分。 Assert类(硬断言) 断言类是Ass...

  • maven tests

    (一)关于断言assert 断言assert与异常exception的区别在于:1、断言用于调试代码2、异常用于捕...

网友评论

      本文标题:Linux和Windows中的assert断言

      本文链接:https://www.haomeiwen.com/subject/cpdiwqtx.html