love in C++, live on MFC

to get ready...

C++博客 首页 新随笔 联系 聚合 管理
  47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks
如果看到这个标题时,还不知道什么是errno,那么,你就和我一样.呵呵,我编程也有4,5年了,今天才知道errno.
errno不是我定义的一个变量,也不是否个随意的变量名,而是crt库中定义的一个全局变量
定义:errno Constants (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_errno_Constants.asp)
#if     (defined(_MT) || defined(_DLL)) && !defined(_MAC)
_CRTIMP 
extern int * __cdecl _errno(void);
#define errno   (*_errno())

#else   /* ndef _MT && ndef _DLL */
_CRTIMP 
extern int errno;
#endif  /* _MT || _DLL */
实际上,就是再一些crt函数调用后,errno会被赋值,表示函数调用的状态.有点类似window api中的GetLastError
这些crt函数包括fgetpos或者ftell和strtol之类.
在什么时候用它呢?看下面的一个例子:
    const char* chTest = "123456789222299999999";
    
char* pStop =
 NULL;
    
int nValue = strtol(chTest, &pStop, 10
);

    
int nError =
 errno;
    
if(nError ==
 ERANGE)
        perror(chTest);
这个时候,nValue = 0x7fffffff,你如果只是根据它来判断,是不知道实际上已经出错了.所以,这个时候必须借助errno来判断状态.

惭愧啊,今天才知道.今天看strtol的msdn文档,看到一句话For both functions, errno is set to ERANGE if overflow or underflow occurs.,我看了半天没有找到errno,后来一搜,才发现它居然是个全局变量.
posted on 2006-04-13 19:15 flyingxu 阅读(3007) 评论(2)  编辑 收藏 引用 所属分类: C/C++

Feedback

# re: 尽可能的使用全局变量errno来判断状态 2006-04-13 20:14 cf
用c/c++还是得看看iso/iec 9899和14882啊,msdn确实系统且有条理,但其中ms扩展的太多,使人未免难辨其里

例如关于errno,标准就有明确的说法,9899:1999, 7.5节  回复  更多评论
  

# re: 尽可能的使用全局变量errno来判断状态 2006-08-22 13:47 flyingxu
也许应该看标准的东西,今天发现msdn说的很模糊,或者说,把一个很关键的地方没有说,就是在使用errno前,要将errno清零,否则没有溢出也会有errno == ERANGE错误  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理