assert.h头文件支持的断言库是一个用于辅助调试程序的小型库。它由assert()宏组成,接受一个整型表达式作为参数。如果表达式求值为假(非零),assert()宏就在标准错误流(stderr)中写入一条错误信息,并调用abort()函数终止程序(abort()函数的原型在stdlib.h头文件中)。assert()宏是为了标识出程序中某些条件为真的关键位置,如果其中的一个具体条件为假,就用assert()语句终止程序。通常,assert()的参数是一个条件表达式或逻辑表达式。如果assert()中止了程序,它首先会显示失败的测试、包含测试的文件名和行号。
如果认为已经排除了程序的bug,就可以把#define NDEBUG宏定义在#include <assert.h>前面,并重新编译程序,这样编译器就会禁用文件中的所有assert()语句。
C11新增了static_assert宏,展开为_Static_assert。_Static_assert是一个关键字,被认为是一种声明形式。它以这种方式提供一个编译时检查:
_Static_assert(常量表达式,字符串字面量);
如果对常量表达式求值为0,编译器会给出一条包含字符串字面量的错误消息;否则,没有任何效果。
示例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> //定义下面的宏可以关闭assert()检查 //#define NDEBUG #include <assert.h> int main(int argc, char* argv[]) { double x, y, z; puts("Enter a pair of numbers (0 0 to quit):"); while (scanf("%lf%lf", &x, &y) == 2 && (x != 0 || y != 0)) { z = x * x - y * y; //不满足z>=0条件,则显示报错信息,并自动退出程序 assert(z >= 0); printf("answer is %f\n", sqrt(z)); puts("Next pair of numbers:"); } puts("Done"); system("pause"); return 0; //main()函数退出时会隐式调用exit() }