以下是标准 C99 版本的 <assert.h> 的实现:

 /* assert.h 头文件 */
 #undef assert
 #ifdef NDEBUG
 #define assert(_Ignore) ((void)0)
 #else
 void _Assertfail(char *, char *, int, char *);
 #define assert(_Test) ((_Test)?((void)0):_Assertfail(#_Test,__FILE__,__LINE__,__func__))
 #endif
 /* 文件结束 */
 
 /* xassertfail.c -- _Assertfail 函数实现 */
 #include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
 void
 _Assertfail(char *test, char *filename, int line_number, char *function_name)
 {
    fprintf(stderr, "断言失败: %s, 函数 %s, 文件 %s, 行号 %d.",
            test, function_name, filename, line_number);
    abort();
 }
 /* 文件结束 */

解释:

  • 在标准的 C99 中,assert 宏用于在调试时进行断言测试。如果 assert 中的条件为假,它会触发错误并调用 abort() 函数终止程序执行。
  • 如果定义了 NDEBUG(通常用于禁用调试模式),assert 宏会变成一个空操作,即不执行任何操作。
  • 否则,assert 宏会检查条件 _Test,如果条件不成立(即为假),它会调用 _Assertfail 函数打印错误信息,并通过 abort() 终止程序。
Last modified: Sunday, 12 January 2025, 1:34 PM