gpt4 book ai didi

c++ - 将errno转换为退出代码

转载 作者:行者123 更新时间:2023-12-03 08:16:42 24 4
gpt4 key购买 nike

我正在使用大量文件系统功能的lib。
我想要的是在文件系统功能失败的情况下,函数会根据 errno 返回各种错误代码(错误不只是-1)。
虽然我可以直接使用 errno值,但是我想在函数错误代码系统errno 之间创建一些抽象层(例如,我的错误值从-1000开始,为负,而errno值为正)。
我的问题是实现它的最佳方法是什么。
现在,我看到两种可能的解决方案:

  • 使用带有错误代码的枚举和切换大小写函数进行翻译,例如:
  •     typedef enum {
    MY_ERROR_EPERM = -1104, /* Operation not permitted */
    MY_ERROR_ENOENT = -1105, /* No such file or directory */
    // ...
    } MyReturnCodes_t;
    int ErrnoToErrCode(unsigned int sysErrno) {
    int error = ENOSYS;
    switch(sysErrno) {
    case EPERM: error = MY_ERROR_EPERM; break;
    case ENOENT: error = MY_ERROR_ENOENT; break;
    // ...
    }
    return error;
    }
  • 直接在中使用翻译枚举:
  • #define ERR_OFFSET -1000
    typedef enum {
    MY_ERROR_EPERM = ERR_OFFSET - EPERM, /* Operation not permitted */
    MY_ERROR_ENOENT = ERR_OFFSET - ENOENT, /* No such file or directory */
    MY_ERROR_ESRCH = ERR_OFFSET - ESRCH, /* No such process */
    // ...
    } MyReturnCodes_t;
    哪种方式更稳定?
    还有一点:该库应同时用于 QNX Linux操作系统,对齐errno代码的正确方法是什么(在某些情况下有所不同)?

    最佳答案

    我会在专用功能中使用std::map。只要使用提供的错误宏,您就不必担心间隙或任何其他问题:

    #include <iostream>
    #include <errno.h>
    #include <map>

    namespace MyError
    {

    enum MyReturnCode: int
    {
    MY_INVALID_VAL = 0 , /* Invalid Mapping */
    MY_ERROR_EPERM = -1104, /* Operation not permitted */
    MY_ERROR_ENOENT = -1105, /* No such file or directory */
    };

    MyReturnCode fromErrno(int e)
    {
    static const std::map<int, MyReturnCode> mapping {
    { EPERM, MY_ERROR_EPERM},
    { ENOENT, MY_ERROR_ENOENT}
    };

    if(mapping.count(e))
    return mapping.at(e);
    else
    return MY_INVALID_VAL;
    }

    }

    int main()
    {
    std::cout << MyError::fromErrno(ENOENT) << std::endl;
    std::cout << MyError::fromErrno(42) << std::endl;

    return 0;
    }
    http://coliru.stacked-crooked.com/a/1da9fd44d88fb097

    关于c++ - 将errno转换为退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65793885/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com