【转载++】C/C++错误分析errno,perror,strerror和GetLastError()函数返回的错误代码的意义...

本文是上一篇“fopen返回0(空指针NULL)且GetLastError是0”的侧面回应。听赶来多么地正确和不容置疑,返回NULL时调用GetLastError来看看报错啊,但当时却返回了0,大家都觉得系统哪里出了大问题。事实上,正如:http://www.runoob.com/cprogramming/c-function-fopen.html ,又http://www.cplusplus.com/reference/cstdio/fopen/ 中所开示的那样,“如果返回NULL请查看errno值,在大多数情况下errno值也会被置于依赖于系统的错误码之中”。很显然,上文中提及的句柄不足的情形下时GetLastError并没有被赋值。另一方面,调用C的库函数fopen(全小写)之后又调用Windows的API GetLastError(首字母大写)本身就有些突兀。【换句话说】如果调用fopen则后面调用errno,调用GetLastError前请调用Windows API(这里对应的是CreateFile)。

该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
On most library implementations, the errno variable is also set to a system-specific error code on failure.

 

如下转载:https://www.cnblogs.com/gjianw217/p/3251928.html

在C语言编译中,经常会出现一些系统的错误,这些错误如果在编译的时候不能很好的“预见”,会使系统“崩溃”,常见的捕获错误函数有:

errno

#include<errno.h>

这个变量是程序默认的参数,并不需要程序员显式定义,但必须声明:extern int errno; 并且需要包含头文件 errno.h

perror()原型:

#include <stdio.h>
void perror(const char *msg);
它是基于errno的当前值,在标准出错上产生一条出错信息,然后返回。它首先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。

strerror()原型:

#include <string.h>
char * strerror(int errnum);
此函数将errnum(它通常就说errno值)映射为一个出错信息字符串,并返回此字符串的指针。

VC6++测试代码

 1 #include <stdio.h> 
 2 #include <fcntl.h> 
 3 #include <errno.h>  
 4 #include <string.h>    
 5 
 6 int main () {    
 7     extern int errno;    
 8     int fd = open("a.txt", O_RDWR);  
 9     if (fd == -1)  
10     {       
11        perror ("error1");                                 //perror的使用
12        printf ("errno2: %d\n", errno);             //errno的使用
13        printf ("error3:%s\n",strerror(errno));  //strerror的使用
14 
15     }   
16 
17     return 0;
18 
19  }

 

在VC中编写应用程序时,经常需要涉及到错误处理问题。许多函数调用只用TRUE和FALSE来表明函数的运行结果。一旦出现错误,MSDN中往往会指出请用GetLastError()函数来获得错误原因。 可问题是,GetLastError()返回的只是一个双字节数值(DWORD)。一般的调用方法为:

DWORD dw;dw = GetLastError();

 

转载于:https://www.cnblogs.com/mxcher/p/9986160.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值