errno 的 C 包装器

C wrapper to errno

我已经编写了包装 errno 的函数,但是我有编译错误: 错误:‘EACCES’未声明(首次在此函数中使用) 案例 EACCES: 我做错了什么?如何用 switch-case 包装 errno? status_t 定义为相关错误的枚举。

static status_t GetErrorStatus (int errno_value)
    {
        status_t err_status = COMMON_ERROR;

        switch (errno_value) 
        {
            case EACCES: 
                err_status = NO_ACCESS_PERMISSION;
                break;
            case EPERM:
                err_status = NO_ACCESS_PERMISSION;
                break;
            case EIDRM:
                err_status = SEMAPHORE_REMOVED;
                break;
            case ENOENT:
                err_status = FILE_DOESNT_EXIST;
                break;
            case EEXIST:
                err_status = SEMAPHORE_ALREADY_EXISTS;
                break;

            default: err_status = COMMON_ERROR;
        }
        return (err_status);
    }

显示完整代码。

我的猜测是 您忘记了 #include <errno.h> 或者您的特定系统 EACCESS 未定义。

在 Linux 上阅读 errno(3)EACCESS 被称为 POSIX,因此在某些非 POSIX 系统上它可能未被定义。

C11 标准 n1570 在其 §7.5 中提到了 errnoEACCESS 未在此处列出。如果它存在,它应该是一个宏,所以你可以用 #ifdef EACCESS ... #endif

包装你的代码的一些适当部分

How can I wrap the errno with switch-case?

并非所有平台都支持各种错误。 C只指定了3个:EDOM EILSEQ ERANGE in <errno.h> 重要的是,它们是macros。我希望其他特定于平台的错误也可以测试。

    switch (errno_value) 
    {
        #ifdef EACCES
        case EACCES: 
            err_status = NO_ACCESS_PERMISSION;
            break;
        #endif
        #ifdef EPERM
        case EPERM:
            err_status = NO_ACCESS_PERMISSION;
            break;
        #endif
        ...