【问题标题】:How do I use errno in C++如何在 C++ 中使用 errno
【发布时间】:2011-12-15 14:41:45
【问题描述】:

我不明白 c++ 中的 errno 库是干什么用的?其中设置了哪些类型的错误,我如何知道哪个数字代表哪个错误?

会影响程序执行吗?

【问题讨论】:

标签: c++ error-handling


【解决方案1】:

errno.h 是 C++ 的 C 子集的一部分。它由 C 库使用并包含错误代码。如果对函数的调用失败,则将变量“errno”设置为与错误相对应。

如果您使用的是 C++ 标准库,它将毫无用处。

在 C 中,您有将 errno 代码转换为 C 字符串的函数。如果你的代码是单线程的,你可以使用strerror,否则使用strerror_r(见http://www.club.cc.cmu.edu/~cmccabe/blog_strerror.html

例如在 C 中它是这样工作的:

 int result = call_To_C_Library_Function_That_Fails();

 if( result != 0 )
 {
    char buffer[ 256 ];
    strerror_r( errno, buffer, 256 ); // get string message from errno, XSI-compliant version
    printf("Error %s", buffer);
     // or
    char * errorMsg = strerror_r( errno, buffer, 256 ); // GNU-specific version, Linux default
    printf("Error %s", errorMsg); //return value has to be used since buffer might not be modified
    // ...
 }

当您使用 C 库或 C 中的操作系统库时,您当然可能在 C++ 中需要它。例如,如果您在 Unix 系统中使用 sys/socket.h API。

使用 C++,如果您要对 C API 调用进行包装,则可以使用自己的 C++ 异常,该异常将使用 errno.h 从 C API 调用错误代码中获取相应的消息。

【讨论】:

  • 这个在windows上能用吗...因为我在网上发现它只能在unix上工作
  • 几乎是正确的,但是很多函数在失败时只返回单个值(例如-1),并将errno设置为实际的错误代码。所以你想要strerror_r(errno,...) 而不是strerror_r(errorCode,...)errno 本身就是一个怪异的伪全局变量。
  • @MikeSeymour 哦,是的,你是对的。上次我检查时,errno 是我的 linux 上的一个线程局部变量,所以它有点安全。我猜是/并非总是如此。
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多