2

我的目标

我有多个函数将返回大量错误代码。某些功能将使用“错误代码列表”的相同且不同的错误代码

  • 例如:
    • fun1()只会返回errorcode1OR errorcode2 (errorcode2 仅用于此函数)
    • fun2()只会返回errorcode1OR errorcode3 (但两个函数中都使用了 errorcode1)

所需的解决方案应考虑以下几点:-

  • 定义哪个函数可以返回什么错误代码

  • 如果任何函数尝试返回不适合此函数的错误代码,则获取编译错误

  • 无论函数返回或抛出都必须可转换为 int(因为这些函数将是 C API 的一部分)

我的方法

到目前为止,我考虑过使用枚举的选项,但解决方案对我没有吸引力

  1. 为每个函数定义一个单独的枚举
  2. 为所有函数定义一个全局枚举

为每个函数定义一个单独的枚举

enum errorcodefun1 {errorcode1=1, errorcode2=2};               // OK at least it is expressed what is expected for fun1
errorcodefun1 fun1() {  };  
enum errorcodefun2 {errorcode1_fun2=1, errorcode3_fun2=3  };   // minor problem: not expressing that errorcode1_fun2 is logical same as errorcode1

功能越多(部分使用相同的错误代码),我得到的代码重复就越多。

为所有函数定义一个枚举

enum errorcodes {errorcode1=1, errorcode2=2, errorcode3=3};
errorcode fun1() {... } //do not like because I will get no compilation error if it returns errorcode3. Only errorcode1 and errocode2 is intended
errorcode fun2() {... } 

我的问题

我正在考虑编写一个模拟枚举的类,但到目前为止,我看到了满足我所有需求的解决方案。

您对如何实现我的目标有什么建议或想法吗?

4

2 回答 2

3

如何使用方法#1 但保持安全并表达枚举成员的等价性?

enum generic_error {
    ERR_OK,
    ERR_NOMEM,
    ERR_IO,
    ERR_GENERIC
};

enum first_error {
    FIRSTERR_OK = ERR_OK,
    FIRSTERR_NOMEM = ERR_NOMEM
};

enum second_error {
    SECONDERR_OK = ERR_OK,
    SECONDERR_IO = ERR_IO
};

int main()
{
    enum first_error f = FIRSTERR_OK;
    enum second_error s = SECONDERR_OK;
    assert(f == s); // never fires
    return 0;
}

不过,这并不是特别好的做法……如果我是你,我真的会选择一个常见的错误代码枚举。

于 2013-11-01T12:59:03.840 回答
-1

使用位掩码。

enum Code : unsigned int
{
    None = 0,
    SomeError= 1,
    AnotherError = 2,
    YetAnotherError = 4
};

unsigned int valid_error_codes_for_func1 = SomeError | YetAnotherError;
于 2013-11-01T13:03:45.960 回答