牛骨文教育服务平台(让学习变的简单)
博文笔记

C语言中的断言

创建时间:2018-11-04 投稿人: 浏览次数:820
版权声明:xueliangwang https://blog.csdn.net/ShyLoneGirl/article/details/83721884

引例

假设要求程序输入两个数先后为X和Y,要求 X >= Y,否则即认为程序错误。代码如下。

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

int main()
{ 
	double x, y, z;
	puts("Enter X and Y (X > Y): ");
	while (scanf("%lf%lf", &x, &y) == 2 )
	{ 
		z = x - y;
		assert(z >= 0); 
		puts("OK
Enter X and Y (X > Y): ");
	}
	return 0;
}

运行结果如下图
在这里插入图片描述

asert()的使用

由此可见,如果 assert()中止了程序, 它会显示失败的测试、 包含测试的文件名和行号

assert()接受一个整型表达式作为参数。如果表达式求值为假,assert()宏就在标准错误流(stderr) 中写入一条错误信息, 并调用abort()函数终止程序。因此如下也能完成上述功能(abort()函数的原型在stdlib.h头文件中):

if (z < 0)
{ 
	puts("z less than 0");
	abort();
}

assert()宏定义在assert.h 头文件中,它是一个用于辅助调试程序的小型库。

另外一个重要特点就是无需更改代码就能开启或关闭 assert()的机制。 如果认为已经排除了程序的 bug, 就可以把下面的宏定义写在包含assert.h的位置前面

#define NDEBUG

并重新编译程序, 这样编译器就会禁用文件中的所有 assert()语句。 如
果程序又出现问题, 可以注释掉这条#define指令, 然后重新编译程序, 这样就重新启用了assert()语句。

_Static_assert

assert()表达式是在运行时进行检查。 C11新增的_Static_assert声明可以在编译时检查assert()表达式。 因此, assert()可以导致正在运行的程序中止, 而_Static_assert()可以导致程序无法通过编译。

_Static_assert() 接受两个参数。 第1个参数是整型常量表达式, 第2个参数是一个字符串。 如果第 1 个表达式求值为 0,编译器会显示字符串, 而且不编译该程序。 如下,编译报错。

// statasrt.c
#include <stdio.h>
#include <limits.h>

_Static_assert(CHAR_BIT == 16, "16-bit char falsely assumed");
int main(void)
{ 
	puts("char is 16 bits.");
	return 0;
}

在这里插入图片描述

参考

C Primer Plus

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。