C++ Assert()断言机制原理以及使用

msdn原文如是说:

Evaluates an expression and, when the result is false, prints a diagnostic++ message and aborts the program.

(判断一个表达式,如果结果为假,输出诊断消息并中止程序。)

void assert(      int expression   );

登录后复制

参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零)

原理:assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

立即学习“C++免费学习笔记(深入)”;

MSDN示例程序;

// crt_assert.c  // compile with: /c  #include   #include   #include     void analyze_string( char *string );   // Prototype    int main( void )  {     char  test1[] = "abc", *test2 = NULL, test3[] = "";       printf ( "Analyzing string '%s'", test1 ); fflush( stdout );     analyze_string( test1 );     printf ( "Analyzing string '%s'", test2 ); fflush( stdout );     analyze_string( test2 );     printf ( "Analyzing string '%s'", test3 ); fflush( stdout );     analyze_string( test3 );  }    // Tests a string to see if it is NULL,   // empty, or longer than 0 characters.  void analyze_string( char * string )  {     assert( string != NULL );        // Cannot be NULL     assert( *string != '' );       // Cannot be empty     assert( strlen( string ) > 2 );  // Length must exceed 2  }

登录后复制

输出结果

Analyzing string 'abc'  Analyzing string '(null)'  Assertion failed: string != NULL, file assert.cpp, line 25    abnormal program termination

登录后复制

用法总结:

1)在函数开始处检验传入参数的合法性
如:

int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
//返回值:缓冲区当前长度
//说明:保持原信息内容不变     nNewSizeassert(nNewSize >= 0);
assert(nNewSize

  …
}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好: assert(nOffset>=0 && nOffset+nSize

好: assert(nOffset >= 0);
     assert(nOffset+nSize

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误: assert(i++ 这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
正确: assert(i          i++;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,assert不能代替条件过滤

ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。
   而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include
#define NDEBUG
#include

加入#define NDEBUG之后,上文第一个例子输出结果为:

Analyzing string 'abc'  Analyzing string '(null)'  Analyzing string ''

登录后复制

在面试中经常用到的一个题目:

已知memcpy的函数为: void* memcpy(void *dest , const void* src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。

void* memcpy(void *dst, const void *src, size_t count)      {          //安全检查      assert( (dst != NULL) && (src != NULL) );            unsigned char *pdst = (unsigned char *)dst;          const unsigned char *psrc = (const unsigned char *)src;            //防止内存重复      assert(!(psrc

 以上就是C++ Assert()断言机制原理以及使用的内容,更多相关内容请关注PHP中文网(www.php.cn)!

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2553321.html

(0)
上一篇 2025年3月6日 06:42:38
下一篇 2025年3月6日 06:42:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • C++复习要点总结(一)

    c++++对c语言的加强——类型加强 1. register 关键字增强 register关键字 请求编译器让变量直接放在寄存器里面,速度快。 在c语言中 register修饰的变量 不能取地址;在c++中可以取地址。 2. 变量检测增强 …

    编程技术 2025年3月6日
    200
  • C# 判断两张图片是否一致的快速方法

    c# 判断两张图片是否一致的快速方法 #region 判断图片是否一致   ///    /// 判断图片是否一致   ///    /// 图片一   /// 图片二   /// 是否一致   public bool IsSameImg(…

    编程技术 2025年3月6日
    200
  • c#学习日记01–新手上路

       对于c#(sharp)说实话我也是刚开始自学,大二了我的主修其实是java,但是c#我也不会落下,从今天开始踏上自学c#之路! 一:认识C#与.NET        .NET/dotnet:一般指.Net Framework框架。是一…

    编程技术 2025年3月6日
    200
  • C# 运算符重载

    您可以重定义或重载 c# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。 例如,请看下…

    编程技术 2025年3月6日
    200
  • C#编程中的泛型

    .net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。通过使用泛型,我们可以极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程度上提升了应用程序的性能。本文将系统地为大家讨论泛型,我们先从理解泛型…

    编程技术 2025年3月6日
    200
  • C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到。 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运…

    编程技术 2025年3月6日
    200
  • C#基础回顾Async 的返回类型

    序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈。 异步方法具有三个可能的返回类型:Task、Task 和 void。  什么时候需要使用哪一种返回类型,具体情况需要具体分析。…

    编程技术 2025年3月6日
    200
  • C#开发之winform(公共控件)

    一、客户端设计思路 1.理顺设计思路,架构框架 2.设计界面 3.编写后台代码 4.数据库访问 二、公共控件 1、Button(按钮):        ⑴ Enabled :确定是否启用控件        ⑵ Visible:确定控件是否课…

    编程技术 2025年3月6日
    200
  • C#拾遗之小知识(三):类

    是抽象的概念。   例如Dog类描述了狗有的一些特性,体重、身高、年龄、以及吼叫等等。 public class Dog  {  string dogBreed;//犬种  int weight; //体重  int height; //升…

    编程技术 2025年3月6日
    200
  • C#拾遗之小知识(四):继承

    方法重写:     基类方法标识virtual关键字,子类(继承类)中方法重写标识override关键字。     重写的方法必须跟基类的类型相同,如方法名称、返回和接受参数。   public class Class1    {     …

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论