我如何在C++中使用errno

Coo*_*der 11 c++ error-handling

我无法理解c ++中的errno库是为了什么?在其中设置了哪些类型的错误,如何知道哪个数字代表哪个错误?

它会影响程序执行吗?

Nik*_*kko 12

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
    // ...
 }
Run Code Online (Sandbox Code Playgroud)

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

使用C++,如果您正在围绕C API调用进行包装,则可以使用自己的C++异常,这些异常将使用errno.h从C API调用错误代码中获取相应的消息.

  • 几乎正确,但许多函数在失败时只返回单个值(例如“-1”),并将“errno”设置为实际的错误代码。所以你需要 `strerror_r(errno,...)` 而不是 `strerror_r(errorCode,...)`。`errno` 本身是一个奇怪的伪全局变量。 (2认同)