最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法

 更新時(shí)間:2015年08月24日 10:05:26   作者:selFire  
這篇文章主要介紹了C語言中的錯(cuò)誤報(bào)告errno與其相關(guān)應(yīng)用方法,包括errno和strerror以及perror的介紹,需要的朋友可以參考下

C語言標(biāo)準(zhǔn)庫中的錯(cuò)誤報(bào)告用法有三種形式。
1、errno
errno在<errno.h>頭文件中定義,如下

#ifndef errno 
extern int errno; 
#endif 

外部變量errno保存庫程序中實(shí)現(xiàn)定義的錯(cuò)誤碼,通常被定義為errno.h中以E開頭的宏,
所有錯(cuò)誤碼都是正整數(shù),如下例子

# define EDOM 33  /* Math argument out of domain of function. */ 

EDOM的意思是參數(shù)不在數(shù)學(xué)函數(shù)能接受的域中,稍后的例子中用到了這個(gè)宏。
errno的常見用法是在調(diào)用庫函數(shù)之前先清零,隨后再進(jìn)行檢查。

在linux中使用c語言編程時(shí),errno是個(gè)很有用的動動。他可以把最后一次調(diào)用c的方法的錯(cuò)誤代碼保留。但是如果最后一次成功的調(diào)用c的方法,errno不會改變。因此,只有在c語言函數(shù)返回值異常時(shí),再檢測errno。
errno會返回一個(gè)數(shù)字,每個(gè)數(shù)字代表一個(gè)錯(cuò)誤類型。詳細(xì)的可以查看頭文件。/usr/include/asm/errno.h
如何把errno的數(shù)字轉(zhuǎn)換成相應(yīng)的文字說明?

一個(gè)簡單的例子

#include <stdio.h> 
#include <errno.h> 
#include <string.h> 
#include <math.h> 
 
int main(void) 
{ 
 errno = 0; 
 int s = sqrt(-1); 
 if (errno) { 
  printf("errno = %d\n", errno); // errno = 33 
  perror("sqrt failed"); // sqrt failed: Numerical argument out of domain 
  printf("error: %s\n", strerror(errno)); // error: Numerical argument out of domain 
 } 
 
 return 0; 

2、strerror
strerror在<string.h>中定義,如下
__BEGIN_NAMESPACE_STD 
/* Return a string describing the meaning of the `errno' code in ERRNUM.  */ 
extern char *strerror (int __errnum) __THROW; 
__END_NAMESPACE_STD 
函數(shù)strerror返回一個(gè)錯(cuò)誤消息字符串的指針,其內(nèi)容是由實(shí)現(xiàn)定義的,字符串不能修改,但可以在后續(xù)調(diào)用strerror函數(shù)是覆蓋。

char *strerror(int errno)

使用方式如下:

fprintf(stderr,"error in CreateProcess %s, Process ID %d ",strerror(errno),processID)

將錯(cuò)誤代碼轉(zhuǎn)換為字符串錯(cuò)誤信息,可以將該字符串和其它的信息組合輸出到用戶界面。
注:假設(shè)processID是一個(gè)已經(jīng)獲取了的整形ID

3、perror
perror在<stdio.h>中定義,如下
__BEGIN_NAMESPACE_STD 
/* Print a message describing the meaning of the value of errno.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */ 
extern void perror (const char *__s); 
__END_NAMESPACE_STD 
函數(shù)perror在標(biāo)準(zhǔn)錯(cuò)誤輸出流中打印下面的序列:參數(shù)字符串s、冒號、空格、包含errno中當(dāng)前錯(cuò)誤碼的錯(cuò)誤短消息和換行符。在標(biāo)準(zhǔn)C語言中,如果s是NULL指針或NULL字符的指針,則只打印錯(cuò)誤短消息,而不打印前面的參數(shù)字符串s、冒號及空格。

void perror(const char *s)

函數(shù)說明
perror ( )用來將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)錯(cuò)誤(stderr),參數(shù)s 所指的字符串會先打印出,后面再加上錯(cuò)誤原因 字符串。此錯(cuò)誤原因依照全局變量 errno 的值來決定要輸出的字符串。
另外并不是所有的c函數(shù)調(diào)用發(fā)生的錯(cuò)誤信息都會修改errno。例如gethostbyname函數(shù)。
errno是否是線程安全的?
errno是支持線程安全的,而且,一般而言,編譯器會自動保證errno的安全性。
我們看下相關(guān)頭文件 /usr/include/bits/errno.h
會看到如下內(nèi)容:

# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())
# endif
# endif /* !__ASSEMBLER__ */
#endif /* _ERRNO_H */

也就是說,在沒有定義__LIBC或者定義_LIBC_REENTRANT的時(shí)候,errno是多線程/進(jìn)程安全的。
為了檢測一下你編譯器是否定義上述變量,不妨使用下面一個(gè)簡單程序。

#include <stdio.h>
#include <errno.h>
 
int main( void )
{
#ifndef __ASSEMBLER__
  printf( "Undefine __ASSEMBLER__/n" );
#else
  printf( "define __ASSEMBLER__/n" );
#endif
 
#ifndef __LIBC
  printf( "Undefine __LIBC/n" );
#else
  printf( "define __LIBC/n" );
#endif
 
#ifndef _LIBC_REENTRANT
  printf( "Undefine _LIBC_REENTRANT/n" );
#else
  printf( "define _LIBC_REENTRANT/n" );
#endif
 
  return 0;
}

 

相關(guān)文章

  • C++中左值和右值的區(qū)別詳解

    C++中左值和右值的區(qū)別詳解

    大家好,本篇文章主要講的是C++中左值和右值的區(qū)別詳解,感興趣的同學(xué)趕緊來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    C+繼承之同名覆蓋,函數(shù)重寫與多態(tài)詳解

    這篇文章主要介紹了C+繼承之同名覆蓋,函數(shù)重寫與多態(tài),是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長子串)

    C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長子串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(159.最多有兩個(gè)不同字符的最長子串),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中的六個(gè)函數(shù)

    C++中的六個(gè)函數(shù)

    本文給大家介紹了C++中的六個(gè)函數(shù),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • C++深入刨析優(yōu)先級隊(duì)列priority_queue的使用

    C++深入刨析優(yōu)先級隊(duì)列priority_queue的使用

    最近我學(xué)習(xí)了C++中的STL庫中的優(yōu)先級隊(duì)列(priority_queue)容器適配器,對于優(yōu)先級隊(duì)列,我們不僅要會使用常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的
    2022-08-08
  • c語言尾隊(duì)列tailq使用示例分享

    c語言尾隊(duì)列tailq使用示例分享

    這篇文章主要介紹了c語言尾隊(duì)列tailq使用示例,大家參考使用吧
    2014-01-01
  • 一篇文章教你在C++中操作符可分為哪幾種類和用法

    一篇文章教你在C++中操作符可分為哪幾種類和用法

    這篇文章主要介紹了C++編程中操作符的種類和用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言入門篇--注釋,關(guān)鍵字typedef及轉(zhuǎn)義字符詳解

    C語言入門篇--注釋,關(guān)鍵字typedef及轉(zhuǎn)義字符詳解

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的關(guān)鍵字typedef,注釋,轉(zhuǎn)義字符的基本理論知識,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • 老生常談c++中的靜態(tài)成員

    老生常談c++中的靜態(tài)成員

    有時(shí)候需要類的一些成員與類本身相關(guān)聯(lián),而不是與類的每個(gè)對象相關(guān)聯(lián)。比如類的所有對象都要共享的變量,這個(gè)時(shí)候我們就要用到類的靜態(tài)成員,今天通過實(shí)例代碼給大家詳細(xì)介紹,需要的朋友參考下吧
    2021-07-07
  • C語言超全面覆蓋操作符知識點(diǎn)

    C語言超全面覆蓋操作符知識點(diǎn)

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。讓我們通讀本篇來詳細(xì)了解吧
    2022-06-06

最新評論

台山市| 成都市| 正阳县| 平安县| 濮阳县| 衡阳县| 云霄县| 远安县| 海盐县| 乾安县| 桃园县| 德钦县| 鄂温| 山丹县| 邓州市| 庆安县| 广平县| 洛隆县| 公安县| 曲周县| 楚雄市| 潍坊市| 桓仁| 赤壁市| 勃利县| 礼泉县| 张家港市| 松江区| 汉中市| 青田县| 嵩明县| 当涂县| 祥云县| 临邑县| 鄂尔多斯市| 曲靖市| 左权县| 南安市| 梧州市| 舟曲县| 淮阳县|