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


    我一直在学习 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语句的开销,通常使用编译器开关。

    1. // BAD
    2. assert(x++);
    3. // GOOD
    4. assert(x);
    5. x++;
    6. // Watch out! Depends on the function:
    7. assert(foo());
    8. // Here's a safer way:
    9. int ret = foo();
    10. assert(ret);

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

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

    看看

    assert() example program in C++

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

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

    Eg

    1. #include <stdio.h>
    2. #include <assert.h>
    3. void yze (char *, int);
    4. int main(void)
    5. {
    6. char *string = "ABC";
    7. int length = 3;
    8. yze(string, length);
    9. printf("The string %s is not null or empty, "
    10. "and has length %d \n", string, length);
    11. }
    12. void yze(char *string, int length)
    13. {
    14. assert(string != NULL); /* cannot be NULL */
    15. assert(*string != '\0'); /* cannot be empty */
    16. assert(length > 0); /* must be positive */
    17. }
    18. /**************** Output should be similar to ******************
    19. The string ABC is not null or empty, and has length 3

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

    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()宏。

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

    输入整数值:10

    你输入了 10。

    输入整数值:-1

    错误信息:程序异常终止

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

  • 相关阅读:
    MQTT 协议概要
    java计算机毕业设计学生信息管理系统源代码+系统+数据库+lw文档
    并行处理系统
    供水管网监测系统
    数据库存储引擎
    win10桌面图标全部变成白色的怎么办
    Weblogic漏洞 CVE-2021-2109 处理
    python的标识符命名规则,保留字表
    【数据结构】带头节点双向循环链表
    代码随想录算法训练营 动态规划part12
  • 原文地址:https://blog.csdn.net/api_ok/article/details/134164962