errno本身是一个整型的全局变量,当使用errno的库函数,在执行出错时,只通过函数返回值哪逗辩返回一个表示出错的标识,如-1或NULL等,具体的出错原因会被赋值到errno中。通过查询errno可以确定具体的出错原因。
在errno.h中定义了一系列常指基见的宏,其形式为
#define EPERM 1 /* Operation not permitted */
可以划分为
1 定义一个宏名,以李缺E开头;
2 定义其值,为一个正整数;
3 一个注释区域,说明该错误号出现时的具体错误内容。
errno.h中的条目因不同编译器的实现而有所区别,一般在100~128条范围内,具体内容可以在编译器的系统标准头文件夹下查看对应文件。
C语言标准库中包含了各种用于处理错误的函数和宏。1、assert( ) 宏
#include<assert.h>
void assert( int expression )
可用于诊断程序bug。expression可以是任何要检测的东西:变量或任何表达式。如果expression为TRUE,则assert()不执行任何 *** 作;否则在stderr上显示一条错误消息,并终止程序的执行。例:assert( x >= 0)为使assert( )宏发挥作用,编程程序必须采用调试模式。以后以发行模式编译程序的最后版本时,assert()将被禁用。
assert( )采取的动作取决于另一个名为NDEBUG宏(表示“不调试”)。如果NDEBUG宏未被定义(默认情况),则assert( )将处于活动状态;否则assert( )将被关闭,因此不起作用。定义NDEBUG宏的代码如下: #define NDEBUG
2、头文件errno.h
头文件errno.h定义了几个宏,用于定义和记录运行错误。这些宏将结合函数perror( )一起使念烂用。头文件errno.h定义了一个名为errno的外部int变量。如果执行时发生错误,C语言函数库中的很多函数都将一个值赋给该变量。
头文件errno.h定义的符号错误常量
名称 值 消息和含义
E2BIG 1000 参数列表过长(超过128字节)
EACCES 5 没有权限(如,试图写一个为只读的文件)
EBADF 6 文件描述符无效
EDOM 1002 数学参数超出范围(将一个不允许的值作为参数传递给数学函数)
EEXIST 80 文件已经羡高槐存在
EMFILE 4 打开过多的文件
ENOENT 2 没有这样的文件或目录
ENOEXEC 1001 执行格式错误
ENOMEM 8 内存不够(如没有足够内存执行exec()函数)
ENOPATH 3 路径未找到
ERANGE 1003 结果超出范围(如数学函数值过大)
可以以两种方式来使用errno。有些函数通过其返回值来指出发生了错误。在这种情况下,可以通过检测errno的值来确定错误的性质,并采取相应的措施。如果无法知道是否发生了错误,可以检测errno。如果它不为0,则说明发生了错误,而errno的值指出了错误的性质。兄友处理完错误后,一定要将errno的值重置为0。
3、perror( )函数
#include<stdio.h>
void perror( const char *msg )
perror( )函数是C语言中另一个错误处理工具,该函数在stderr上显示一条消息,指出库函数调用或系统调用期间,最后发生的一个错误。函数首先打印msg指向的一条可选的、用户定义的消息,然后是冒号以及实现定义的、描述最后发生的错误消息;如果没有错误,则显示no error。函数不会根据错误来采取某种措施。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)