您现在的位置是:首页 > 正文

C语言assert函数:什么是“assert”函数

2024-04-01 00:49:24阅读 0

我一直在学习 OpenCV 教程,遇到了assert函数;它做什么?

assert将终止程序(通常带有引用 assert 语句的消息),如果其参数为 false。它通常在调试过程中使用,以使程序在发生意外情况时更明显地失败。

例如:

assert(length >= 0);  // die if length is negative.

如果失败,您还可以添加要显示的更多信息:

assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");

或者像这样:

assert(("Length can't possibly be negative! Tell jsmith", length >= 0));

当您进行发布(非调试)构建时,您还可以通过定义NDEBUG宏来消除评估assert语句的开销,通常使用编译器开关。

// BAD
assert(x++);
// GOOD
assert(x);    
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);

从程序调用 abort()和不保证做任何事情的组合来看,断言应该只用于测试开发人员假设的事情,而不是例如用户输入数字而不是字母(应该通过其他方式处理)。

assert计算机语句类似于英文语句make sure

看看

assert() example program in C++

许多编译器提供了一个 assert () 宏。如果其参数评估为 TRUE,则 assert () 宏返回 TRUE,如果评估为 FALSE,则采取某种操作。许多编译器会在失败的 assert () 上中止程序;其他人会抛出异常

assert()宏的一个强大功能是,如果未定义 DEBUG,预处理器将其折叠成完全没有代码。在开发过程中,这是一个很大的帮助,当最终产品发布时,没有性能损失,也没有增加程序的可执行版本的大小。

Eg

#include <stdio.h>
#include <assert.h>
void yze (char *, int);
int main(void)
{
   char *string = "ABC";
   int length = 3;
   yze(string, length);
   printf("The string %s is not null or empty, "
          "and has length %d \n", string, length);
}
void yze(char *string, int length)
{
   assert(string != NULL);     /* cannot be NULL */
   assert(*string != '\0');    /* cannot be empty */
   assert(length > 0);         /* must be positive */
}
/****************  Output should be similar to  ******************
The string ABC is not null or empty, and has length 3

assert () 函数可以诊断程序 bug,在 C 中,它是在<assert.h>中定义的,在 C++ 中,它是在<cassert>中定义的,它的原型是

void assert(int expression);

参数表达式可以是任何你想测试的东西 — — 一个变量或任何 C 表达式。如果 expression 的计算结果为 TRUE,assert () 什么也不做。如果 expression 的计算结果为 FALSE,assert () 在 stderr 上显示错误消息并中止程序执行。

您如何使用 assert()?它最常用于跟踪程序错误(与编译错误不同)。错误不会阻止程序编译,但会导致程序给出错误的结果或运行不当(例如,锁定)。例如,您正在编写的财务分析程序可能偶尔会给出错误的答案。您怀疑问题是由变量 interest_rate 在负值上引起的。

assert (interest_rate & gt;= 0);在程序中使用 interest_rate 的位置。如果变量变为负数,则 assert () 宏会向您发出警报。然后,您可以检查相关代码以查找问题的原因。

要查看 assert () 的工作原理,请运行下面的示例程序。如果输入非零值,程序将显示该值并正常终止。如果输入零,assert () 宏将强制异常程序终止。您看到的确切错误消息将取决于您的编译器,但这是一个典型示例:

断言失败:x,文件 list19_3.c,第 13 行注意,为了使 assert()工作,您的程序必须在调试模式下编译。有关启用调试模式的信息,请参阅编译器文档(稍后说明)。当您稍后在发布模式下编译最终版本时,将禁用 assert()宏。

 int x;
 printf("\nEnter an integer value: ");
 scanf("%d", &x);
 assert(x >= 0);
 printf("You entered %d.\n", x);
 return(0);

输入整数值:10

你输入了 10。

输入整数值:-1

错误信息:程序异常终止

您的错误消息可能会有所不同,具体取决于您的系统和编译器,但总体思路是相同的。

网站文章

  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    Springboot项目中,在mybatis中mapper数据库操作接口(有的称DAO,有的直接说mapper,都只同一文件)与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml...

    2024-04-01 00:49:11
  • CSS box-shadow 详解

    box-shadow 是 CSS3 的语法特性,可以实现为元素添加阴影 更多精彩 更多技术博客,请移步 asing1elife’s blog 语法 /* x轴偏移 y轴偏移 模糊半径 大小 颜色 位置 */ box-shadow: offsetX offsetY blur spread color position; 解析 offsetX : x轴偏移 取正值向右偏移,负值向左偏移 b...

    2024-04-01 00:48:45
  • 枚举,泛型,注解笔记(注解深学)

    待更新

    2024-04-01 00:48:39
  • Android实现彩票&quot;刮刮乐&quot;效果

    Android实现彩票&quot;刮刮乐&quot;效果

    在一些应用,比如支付宝、天猫app我们经常能够看到一些刮奖的功能效果,通过用户手指滑动模拟出&quot;刮刮乐&quot;刮奖的视觉效果,让用户有一种刮彩票时候那种“爽”的感觉。 我们接下来就来用代码...

    2024-04-01 00:48:34
  • java 判断 容器_Java Spring ClassPathXmlApplicationContext是如何判断容器内包含某个Bean的...

    java 判断 容器_Java Spring ClassPathXmlApplicationContext是如何判断容器内包含某个Bean的...

    ClassPathXmlApplicationContext的获得方式:ClassPathXmlApplicationContext context =new ClassPathXmlApplicat...

    2024-04-01 00:48:28
  • 分布式架构基础(一)远程通信协议

    分布式架构基础(一)远程通信协议

    远程通信协议 一个http请求的整个流程 负责域名解析的DNS服务 首先,用户访问一个域名,会经过DNS解析。 DNS(Domain Name System),和HTTP协议一样是位于应用层的协议,主...

    2024-04-01 00:47:58
  • 基于注解的用户权限拦截Spring HandlerInterceptor

    基于注解的用户权限拦截Spring HandlerInterceptor

    Spring Boot (v2.0.5.RELEASE)程序中有些资源(接口)是需要用户登录才能够使用的,或者是具有某种角色的用户(比如普通登录用户,或者系统管理员等)才能使用,本篇文章...

    2024-04-01 00:47:51
  • Laravel 打印SQL语句

    类class之前记得引用use Illuminate\Support\Facades\DB; 在方法里面这样干 DB::connection()-&gt;enableQueryLog();#开启执行日...

    2024-04-01 00:47:27
  • 大一大学计算机心得,大学生计算机实训心得体会

    大学生计算机实训心得体会是关于心得体会范文的精选内容,内容包含了与大学生计算机实训心得体会相关的经典语句以及心得体会范文大全、心得体会范文范文、心得体会范文模板等相关资料,为朋友们查找心得体会范文的资...

    2024-04-01 00:47:18
  • BugkuCTF-WEB部分题解(一)

    BugkuCTF-WEB部分题解(一)

    域名解析 访问 flag.baidu.com 提示:找不到网站 无法进行DNS解析 直接访问123.206.87.240 返回400 Bad Request 查询400错误 详情 两种方法解析域名 1.修改hosts文件: 直接在hosts文件中添加flag.bugku.com 120.24.86.145 2.修改头信息: 用burpsuit抓包修改host头信息为flag.bugku...

    2024-04-01 00:47:10