当前位置:网站首页 > 技术博客 > 正文

c++遍历unordered map



如果,想要深入的学习标准C库中perror、strerror函数,还是需要去自己阅读Linux系统中的帮助文档。

具体输入命令:

 

即可查阅到完整的资料信息。

perror函数是C语言标准库中的一个函数,该函数定义在头文件中。perror根据传入的参数(通常是一个字符串)生成一个描述性的错误消息,然后将这个消息输出到标准错误流(stderr)。

函数原型如下:

 

参数:

  • str:一个指向常量字符的指针,用于提供上下文信息。(也就是说,你可以手动的去描述这个错误是怎么发生的)。

perror的工作原理:当一个系统调用或库函数发生错误时,通常会将设置为一个特定的错误码。perror函数读取errno的值,并根据这个值生成相应的错误描述。然后,将错误描述与传入的字符串参数拼接,并输出到标准错误流。

使用示例:

 

在上面的示例中,当试图打开一个不存在的文件时,fopen函数会返回NULL,并将errno设置为一个特定的错误码。

调用perror函数输出类似于以下内容的错误消息:

 

这里的"Error opening file"是传入的字符串参数,而"No such file or directory"是由perror根据errno值生成的描述性错误信息。

strerror函数是标准C库中的一种函数,它用于生成描述错误代码的字符串。这个函数在string.h头文件中定义。

这个函数的原型是:

 

参数:

  • 该函数接受一个,这个参数通常是一个错误代码,比如你可能从某些函数(如open或read)中得到这样的错误代码。

返回值:

  • 函数。这个字符串可以用来打印错误消息,使得用户能够理解发生了什么问题。

例如,你可以这样使用strerror:

 
  • 在这个例子中,如果文件不存在,fopen会返回NULL,并将errno设置为表示错误的值。然后,我们可以使用strerror来获取并打印描述这个错误的消息。
  • 需要注意的是,strerror返回的字符串是静态分配的,不需要(也不应该)被手动释放。此外,因为strerror返回的是静态数据,所以它不是线程安全的。在多线程环境中,你可能需要使用strerror_r,这个函数有一个额外的参数用于存储结果,可以避免竞态条件。
  • 另外,也应该注意strerror可能不会知道所有可能的错误代码。如果你传递一个它不认识的错误代码,它可能会返回一个消息说这个错误未知。

strerror

优点:

  • :strerror返回一个字符串,这使得你可以自由地使用这个字符串。例如,你可以将其存储,发送给用户,或者记录到日志中。
  • 息:可以通过与其他字符串拼接,创建定制的错误消息。

缺点:

  • 需要手动处理错误消息:在打印错误消息时,需要手动处理错误消息的格式化和输出。
  • :strerror在多线程环境中可能会产生问题,因为它返回静态内存中的字符串。如果你需要线程安全,需要使用strerror_r版本。

perror

优点:

  • :perror在打印错误消息时无需处理错误消息的格式化和输出,使得错误处理代码更加简洁。
  • :它自动地在你提供的自定义消息后添加一个描述错误的消息。

缺点:

  • :perror总是将错误消息输出到标准错误输出。如果你需要将错误消息发送到其他地方,你就无法使用perror。
  • :虽然你可以提供自定义消息,但perror控制的消息格式有限。如果你需要更特殊的格式,可能需要使用strerror。

总的来说,选择使用哪一个函数取决于你的需求。如果你需要处理错误消息,例如将其发送到特定的日志系统,或者创建定制的错误消息,那么strerror可能是更好的选择。如果你只需要快速地向用户报告错误,并且默认的格式足够好,那么perror可能是更好的选择。

strerror_r函数是标准C库中的另一种处理错误的函数,它与strerror函数类似,但具有线程安全性。

  • 在标准C库中,strerror_r函数有两个不同的实现:。它们具有不同的原型和行为,我将分别介绍它们。

POSIX版本的strerror_r

POSIX版本的strerror_r的原型如下:

 

这个函数接受三个参数:

  • errnum:错误码。
  • buf:用于存储错误消息的缓冲区。
  • buflen:缓冲区的大小。

返回值

  • 函数的返回值是一个整数,表示操作的成功与否。如果返回值为0,表示成功获取错误消息;如果返回值为正数,表示错误码无效,无法获取错误消息;如果返回值为负数,表示发生了错误。
  • 需要注意的是,POSIX版本的strerror_r函数的行为和strerror函数略有不同。它不返回一个静态字符串指针,而是将错误消息复制到提供的缓冲区中。因此,这个函数是线程安全的,因为它使用了用户提供的缓冲区。

GNU版本的strerror_r

GNU版本的strerror_r的原型如下:

 

这个函数接受三个参数:

  • errnum:错误码。
  • buf:用于存储错误消息的缓冲区。
  • buflen:缓冲区的大小。

返回值

  • 函数的返回值是一个指向错误消息字符串的指针。与strerror函数不同,GNU版本的strerror_r并不返回静态分配的字符串,而是将错误消息复制到提供的缓冲区中,并返回指向缓冲区的指针。
  • 这个版本的strerror_r在多线程环境中是安全的,因为它将错误消息存储在用户提供的缓冲区中,而不是使用静态内存。
  • 需要注意的是,GNU版本的strerror_r与POSIX版本的返回类型和行为不同。在GNU版本中,返回值始终是指向错误消息字符串的指针,不论操作是否成功。

使用哪个版本取决于在编译时使用的特性测试宏。

在我们的讨论中,我们涉及了以下内容:

  • strerror函数:它是标准C库中的函数,用于生成描述错误代码的字符串。它接受一个错误码作为参数,并返回一个描述错误的字符串。这个字符串可以用于打印错误消息或其他需要错误描述的场景。
  • perror函数:它也是标准C库中的函数,用于报告错误消息。它会打印你提供的自定义消息,后跟一个冒号、一个空格,然后是描述当前错误的消息。它的优点是简单易用,适用于快速报告错误的场景。
  • strerror_r函数:它是标准C库中的函数,用于获取描述错误代码的字符串,同时具备线程安全性。它有两个不同的实现:POSIX和GNU。POSIX版本将错误消息复制到用户提供的缓冲区中,并返回一个表示操作成功与否的整数。而GNU版本将错误消息复制到用户提供的缓冲区中,并返回指向缓冲区的指针。

总体而言,strerror函数和strerror_r函数用于获取描述错误的字符串,而perror函数用于报告错误消息。选择使用哪个函数取决于你的需求和编程环境,例如需要灵活性、自定义错误消息还是线程安全性。

版权声明


相关文章:

  • oracle varchar2是字节还是字符2025-04-16 08:01:00
  • ios游戏源码2025-04-16 08:01:00
  • js特效网站源码2025-04-16 08:01:00
  • 135 137 138 139端口2025-04-16 08:01:00
  • 胖熊是啥2025-04-16 08:01:00
  • xcp协议作用是什么2025-04-16 08:01:00
  • c++中,指针的概念2025-04-16 08:01:00
  • axios异步处理2025-04-16 08:01:00
  • C语言函数指针2025-04-16 08:01:00
  • 常用的接口自动化测试框架2025-04-16 08:01:00