c断言的使用_C语言调试工具[通俗易懂]

c断言的使用_C语言调试工具[通俗易懂]assert是在运行时检查,C11新增_Static_assert声明,可以在编译时检查assert()表达式,assert会导致程序的终止,_Static_assert会导致编译的失败_Static_assert接收两个参数,第一个参数是整型常量表达式,第二个参数是一个字符串,如果第一个表达式求值为假(0或_False),编译器会显示字符串,且不通过编译。参数expression是一个要测试的表达式,如果表达式的值为0(假),assert()会输出错误消息并终止程序。,编译出的可执行文件为。_断言库

c断言的使用_C语言调试工具[通俗易懂]"

C语言断言库assert.h提供了一些用于调试程序时进行断言的函数。如果断言失败,会输出错误消息并终止程序。

assert.h中主要的函数是assert(),其原型为:

void assert(int expression);

参数expression是一个要测试的表达式,如果表达式的值为0(假),assert()会输出错误消息并终止程序。如果表达式的值为非0(真),则assert()不做任何事情。

以下是一个使用assert()函数的示例代码:

#include <stdio.h>
#include <assert.h>

int main() {
    int a = 5, b = 0;
    assert(b != 0);   // 断言b不为0,如果为0则输出错误消息并终止程序
    printf("a/b = %d\n", a/b);
    return 0;
}

在上面的代码中,我们使用assert()函数来断言b不为0。但是由于b的值为0,程序会输出错误消息并终止:

Assertion failed: b != 0, file assert_example.c, line 7

 assert()宏接收一个整型表达式作为参数,如果表达式为假,就在标准错误stderr中写入一条错误信息,如测试名,文件名,行号等,并调用abort()终止程序

#include <stdio.h>
#include <assert.h>
int Div(int a, int b)
{
    assert(b != 0);
    return a / b;
}
int main()
{
    printf("%d\n", Div(5, 0));
}

设程序名为test.c,编译出的可执行文件为test,运行程序

est: test.c:5: Div: Assertion `b != 0' failed.

执行test文件,其源文件是test.c,第5行,b!=0的测试未通过。

禁用assert 如果认为已经排除了bug,可以关闭assert(),断言库提供了无须更改代码就可开闭assert的机制 通过在导入<assert.h>之前加上如下的宏定义,可以关闭assert断言。

//此宏定义必须在导入assert.h之前
#define NDEBUG
#include <assert.h>

除了assert()函数外,assert.h中还有一些其他的函数,包括:

static_assert():用于在编译时进行断言,其原型为:

_Static_assert(expression, message);

参数expression是一个要测试的表达式,参数message是一个字符串,用于描述断言失败的原因。如果expression的值为0(假),则编译器会输出message并终止编译。 

 assert是在运行时检查,C11新增_Static_assert声明,可以在编译时检查assert()表达式,assert会导致程序的终止,_Static_assert会导致编译的失败 _Static_assert接收两个参数,第一个参数是整型常量表达式,第二个参数是一个字符串,如果第一个表达式求值为假(0或_False),编译器会显示字符串,且不通过编译。

示例:

#include <assert.h>
#include <limits.h>
#include <stdio.h>
_Static_assert(CHAR_BIT == 16, "char不是16位");
int main()
{
    printf("OK\n");
}

假设该文件名为test.c,使用gcc编译它

$ gcc -o test test.c
test.c:4:1: 错误:静态断言错误:”char is not 16bits”
    4 | _Static_assert(CHAR_BIT == 16, “char is not 16bits”);
      | ^~~~~~~~~~~~~~

NDEBUG常量:如果定义了该常量,则assert()会被禁用,不会进行断言。一般在发布版本中使用NDEBUG常量来禁用assert()。

以上是assert.h中的一些函数及其用法,更多内容可以查询相关的使用手册。

今天的文章c断言的使用_C语言调试工具[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注