如何避免枚举值的冲突?

时间:2014-09-12 03:32:57

标签: c

我正在建立一个前端库。后端会生成许多枚举的错误代码:

enum backerr {BACK_ERR1, BACK_ERR2, BACK_ERR3};

我的前端会产生许多其他错误代码:

enum fronterr {FRONT_ERR1, FRONT_ERR2, FRONT_ERR3};

为方便起见,我希望有一个错误代码返回函数,它将返回前端或后端错误,具体取决于发生的错误。

如果没有两个错误代码的值冲突,有没有办法发生这种情况,并且考虑到我们无法知道后端的值?

2 个答案:

答案 0 :(得分:2)

如果你知道后端可能会产生什么,不,那么,没有办法可靠地选择你自己的错误代码,这样他们就不会发生冲突。< / p>

所以你有几个选择(至少)。

如果后端以某种方式发布错误范围(例如在头文件中),则第一个非常有用。说实话,它应该这样做,因为程序没有别的方法来区分不同的错误代码和/或类型。

如果 已发布,那么您发现最高级别并选择自己的代码就可以为后端留出足够的空间进行扩展。例如,如果后端使用1..100,则可以在1000开始使用struct sFrontError { enum fronterr errorCode; enum backerr backendCode; }; 。任何系统突然报告的错误数量是之前版本的几十倍的可能性很小。

第二种方式是如果你想要真正的分离而没有冲突的可能性。

没有什么可以阻止你返回类似于以下的结构:

enum fronterr {FRONT_OK, FRONT_BACK, FRONT_ERR1, FRONT_ERR2, FRONT_ERR3};

并将其用于您的错误。然后你的前端枚举成为:

errorCode

您可以按如下方式对其进行评估:

  • 如果FRONT_OKerrorCode,则错误。
  • 如果FRONT_BACKbackendCode,则错误来自后端,您可以在errorCode中找到其代码。
  • 否则,它是前端错误,{{1}}中的代码完全指定了它。

答案 1 :(得分:1)

如果后端公开了其错误代码的详尽列表,您可以轻松地创建它们的真实超集,并使用您自己的前端错误代码作为不相交的子集。

/* in backend.h */

enum backend_error
{
  BACK_ERR_1,
  BACK_ERR_2,
  BACK_ERR_3,
};
/* in frontend.h */

#include <backend.h>

enum frontend_error
{
  FRONT_ERR_1 = BACK_ERR_1,
  FRONT_ERR_2 = BACK_ERR_2,
  FRONT_ERR_3 = BACK_ERR_3,
  FRONT_ERR_4,
  FRONT_ERR_5,
};

此方法并不强制您对后端错误代码的值进行任何假设,但如果后端的未来版本定义了其他错误代码,则可能会出现这种情况。另一个缺点是您的头文件#include是后端的标头,因此您正在污染命名空间。

如果您的用户从不直接调用后端,也就是说,您提供了所有后端功能的抽象,您可以完全定义自己的错误代码,并具有将后端错误代码映射到您自己的错误代码的功能。由于此功能不需要作为身份功能,因此即使面对将来对后端的更改,您也可以始终使其工作。它也可以在您自己的实现文件中实现,以保护后端命名空间不受用户的影响。