如果看到這個標題時,還不知道什么是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,后來一搜,才發現它居然是個全局變量.