出错处理头文件
#include <assert.h>
#include <errno.h>
#include <setjmp.h>
1、#include <assert.h>
使用assert() 函数 void assert( scalar expression);
a、参数类型为 scalar (标量) 标量代表原子类型。如 int 、char 、 等非复合类型数据。
此链接详细解释了标量和复合类型 http://c.biancheng.net/ref/34.html
b、assert 的引入会增加额外的检查时间。,所以在测试时使用assert ,在程序最终完成时禁止assert 。 禁止assert 需要在 包含头文件 #include < assert.h> 之前包含 #define NDEBUG 即可。
#define NDEBUG
#include <assert.h>
头文件中的显示如下图片。
c、 不要在assert 中使用有副作用的表达式。 只能是单纯的判断作业的语句。因为一旦采用b 中的方法导致asset 被禁用。会导致赋值或者分配空间等没有操作。导致出错。
d、 如果表达式值为false 或者0 ,assert 函数会向 标准错误流输出错误信息。并使用abort() 结束程序。
2、#include <errno.h>
头文件 errno.h 中声明的int 类型errno 变量存储一个标准错误码。(errno 可能实际上是一个宏,可以像变量一样使用)。 之间博客宏定义中有提高使用连接符生成变量名。
通过检测errno 的值来产生程序运行错误的信号。
void perror(const char *s ); #include <stdio.h>
char *strerror ( int errnum ); #include <string.h>
perror () 函数会在输出字符串 S 的内容后, 输出errno 相关的出错信息。
strerror() 函数会将数字解析为对应的出错信息。 所以可以用来输出errno 对应的出错消息。
3、#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int var);
goto 语句是在同一个函数内跳转, setjmp 头文件可以使一个函数直接跳到另一个函数。
开始使用setjmp (jmp_buf env) 用来标记跳转的位置。 之后使用longjmp(env, var) 跳转到使用setjmp 的位置。此时 setjmp ()的返回值是var , 如果longjmp 中var 的值为0, 则setjmp 在跳转后执行的返回值为1。 并从此处开始重新执行代码。如果没有设置退出条件,会导致一直循环。
图片从setjmp.h 头文件中截取。