国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

C標(biāo)準(zhǔn)庫(kù)源碼解剖(2):錯(cuò)誤報(bào)告errno.h

2024-07-10 13:27:14
字體:
供稿:網(wǎng)友

  errno.h在/usr/include下,定義了存放錯(cuò)誤碼的全局變量errno,及錯(cuò)誤碼EDOM,ERANGE,EILSEQ。它包含了/usr/include/bits下的bits/errno.h頭文件。bits/errno.h不是標(biāo)準(zhǔn)C庫(kù)中的頭文件,在Linux中它為錯(cuò)誤碼提供數(shù)值定義,對(duì)標(biāo)準(zhǔn)C中指定的錯(cuò)誤碼EDOM,ERANGE,EILSEQ定義具體的數(shù)值。
    bits/errno.h如下:

 

[cpp] view plaincopy
  1. /* bits/errno.h: 錯(cuò)誤報(bào)告常量  Linux專用的版本(/usr/include/bits/errno.h)  */  
  2. #ifdef _ERRNO_H  
  3. # undef EDOM  
  4. # undef EILSEQ  
  5. # undef ERANGE  
  6. # include <linux/errno.h>  
  7. /* Linux沒有ENOTSUP錯(cuò)誤碼  */  
  8. # define ENOTSUP EOPNOTSUPP  
  9. /* 早期的Linux版本也沒有ECANCELED錯(cuò)誤碼  */  
  10. # ifndef ECANCELED  
  11. #  define ECANCELED 125  
  12. # endif  
  13. /* 支持健壯鎖機(jī)制的錯(cuò)誤碼  */  
  14. # ifndef EOWNERDEAD  
  15. #  define EOWNERDEAD        130  
  16. #  define ENOTRECOVERABLE   131  
  17. # endif  
  18. # ifndef __ASSEMBLER__  
  19. /* 獲取全局變量errno的地址的函數(shù) */  
  20. extern int *__errno_location (void) __THROW __attribute__ ((__const__));  
  21. #  if !defined _LIBC || defined _LIBC_REENTRANT  
  22. /* 當(dāng)使用線程時(shí),errno是一個(gè)單線程變量 */  
  23. #   define errno (*__errno_location ())  
  24. #  endif  
  25. # endif /* !__ASSEMBLER__ */  
  26. #endif /* _ERRNO_H */  
  27. #if !defined _ERRNO_H && defined __need_Emath  
  28. /* 這個(gè)雖然丑陋,但內(nèi)核并不是完全干凈的。在__need_Emath被定義的情況下,我們必須只定義 
  29.    EDOM,EILSEQ和ERANGE的值 */  
  30. # define EDOM   33  /* 參數(shù)不在數(shù)學(xué)函數(shù)能接受的范圍內(nèi)  */  
  31. # define EILSEQ 84  /* 非法的字節(jié)順序,在翻譯多字節(jié)字符序列時(shí)遇到的編碼錯(cuò)誤  */  
  32. # define ERANGE 34  /* 數(shù)學(xué)函數(shù)的結(jié)果超出范圍  */  
  33. #endif /* !_ERRNO_H && __need_Emath */  

 

    標(biāo)準(zhǔn)C的errno.h頭文件如下:

 

[cpp] view plaincopy
  1. /* ISO C99 Standard: 7.5  錯(cuò)誤報(bào)告   <errno.h> */  
  2. #ifndef _ERRNO_H  
  3. /* 預(yù)處理器如果只需要EDOM和ERANGE的定義,不需要其他任何的錯(cuò)誤碼, 
  4.     則它會(huì)定義__need_Emath宏 */  
  5. #ifndef __need_Emath  
  6. # define _ERRNO_H   1  
  7. # include <features.h>  /* 定義了一些表示編譯選項(xiàng)的宏 */  
  8. #endif  
  9. __BEGIN_DECLS  
  10. /* 從依賴于系統(tǒng)的文件中獲取錯(cuò)誤碼常量,這個(gè)依賴于系統(tǒng)的文件將會(huì)測(cè)試__need_Emath 
  11.     和_ERRNO_H */  
  12. #include <bits/errno.h>   
  13. #undef  __need_Emath  
  14. #ifdef  _ERRNO_H  
  15. /* 定義全局變量errno,除非它被bits/errno.h定義成了一個(gè)宏。 
  16.     在GNU中,它是一個(gè)單線程的變量。有這個(gè)重新定義時(shí)errno宏仍然可以工作,但現(xiàn)在 
  17.     它將成為一個(gè)沒有原型的函數(shù)聲明,可能會(huì)觸發(fā)一個(gè)-W-Wstrict-prototypes警告 */  
  18. #ifndef errno    
  19. extern int errno;   
  20. #endif  
  21. #ifdef __USE_GNU  
  22. /* 程序被調(diào)用時(shí)會(huì)帶有這些變量,它們?cè)诨贏RGV[0]的值來啟動(dòng)程序(僅當(dāng)你使用GNU ld程序) 
  23.     時(shí)會(huì)自動(dòng)被設(shè)置 */  
  24. extern char *program_invocation_name, *program_invocation_short_name;  
  25. #endif /* __USE_GNU */  
  26. #endif /* _ERRNO_H */  
  27. __END_DECLS  
  28. #endif /* _ERRNO_H */  
  29.  /* 有一些<bits/errno.h>中定義了error_t作為一個(gè)枚舉類型,這樣在調(diào)試器里打印error_t的 
  30.      值時(shí)就可以顯示其名稱。即使前面包含了<bits/errno.h>,有時(shí)我們還是需要定義一下 */  
  31. #if defined __USE_GNU || defined __need_error_t  
  32. # ifndef __error_t_defined  
  33. typedef int error_t;    
  34. #  define __error_t_defined 1  
  35. # endif  
  36. # undef __need_error_t  
  37. #endif  

 

    解釋:
    (1)C標(biāo)準(zhǔn)規(guī)定了必須定義錯(cuò)誤碼EDOM,EILSEQ,ERANGE,其值可以由系統(tǒng)自行指定,在Linux中它們分別為33、84、34。
    (2)EDOM表示參數(shù)不在數(shù)學(xué)函數(shù)能接受的范圍內(nèi);EILSEQ表示非法的字節(jié)順序,在翻譯多字節(jié)字符序列時(shí)遇到的編碼錯(cuò)誤;ERANGE表示數(shù)學(xué)函數(shù)的結(jié)果超出范圍。程序產(chǎn)生相應(yīng)錯(cuò)誤時(shí)全局變量errno會(huì)保存對(duì)應(yīng)的錯(cuò)誤碼。
    (3)__BEGIN_DECLS/__END_DECLS宏用來表示數(shù)據(jù)結(jié)構(gòu)及函數(shù)原型聲明的開始和結(jié)束。這類似于MFC中的BEGIN_MESSAGE_MAP/END_MESSAGE_MAP。
    還有兩個(gè)錯(cuò)誤處理函數(shù)perror和strerror。perror在stdio.h中定義,用于打印錯(cuò)誤碼及其消息描述;strerror在string.h中定義,用于獲取錯(cuò)誤碼對(duì)應(yīng)的消息描述。這兩個(gè)函數(shù)在解析相應(yīng)頭文件時(shí)再進(jìn)行分析。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贡嘎县| 同心县| 扎赉特旗| 龙口市| 邛崃市| 孟津县| 长沙县| 钟祥市| 武邑县| 长治市| 昔阳县| 延长县| 牙克石市| 杭州市| 大安市| 吕梁市| 于田县| 清涧县| 仪征市| 六枝特区| 临泉县| 青浦区| 舒城县| 齐齐哈尔市| 西宁市| 克什克腾旗| 高碑店市| 枣强县| 昭苏县| 峨边| 华宁县| 凯里市| 轮台县| 改则县| 阳朔县| 南阳市| 武城县| 商城县| 子洲县| 阳山县| 凭祥市|