关于 ENUM 的 C++ 问题。我得到的响应比枚举列表大

C++ issue regarding ENUM's. The response I get is bigger than the Enum list

现在我有一个库返回给我一个包含枚举的结构。 现在,如果我尝试记录结果,我将得到:

代码:

VIDYO_CLIENT_LOG_INFO_FORMATTED("GuiOnOutEvent NDKMETHOD License Error: errorid=%d vmConnectionPath=%d OutOfLicense=%d Result=%d Fault=%d", error, vmConnectionPath, OutOfLicenses, eventLicense->result, eventLicense->fault);

我感兴趣的是 eventLicense->result,也就是 "Result=%d" 这是我得到的结果:

GuiOnOutEvent NDKMETHOD License Error: errorid=0 vmConnectionPath=1 OutOfLicense=1 Result=26 Fault=0 [ VidyoClientVcsoapThread_3, <unknown func>, app/src/main/jni/ndkVidyoSample.c:62 ]

如您所见,结果为:26。 但是我的枚举看起来像这样:

typedef enum VidyoClientSoapResultCode_
{
VIDYO_CLIENT_SOAP_RESULT_FAILURE,               /*!< Result is some unknown general failure */
VIDYO_CLIENT_SOAP_RESULT_SUCCESS,               /*!< Result is success */
VIDYO_CLIENT_SOAP_RESULT_NOT_LICENSED,          /*!< Not licensed */
VIDYO_CLIENT_SOAP_RESULT_SEAT_LICENSE_EXPIRED,  /*!< Seat license expired */
VIDYO_CLIENT_SOAP_RESULT_WRONG_PIN,             /*!< Wrong PIN */
VIDYO_CLIENT_SOAP_RESULT_CONFERENCE_LOCKED,     /*!< Conference locked */
VIDYO_CLIENT_SOAP_RESULT_ROOM_DISABLED,         /*!< Room disabled */
VIDYO_CLIENT_SOAP_RESULT_GENERAL_FAULT,         /*!< General Fault */
VIDYO_CLIENT_SOAP_RESULT_INVALID_ARGUMENT_FAULT,/*!< Invalid argument fault */
VIDYO_CLIENT_SOAP_RESULT_MEMBER_NOT_ONLINE,     /*!< Status of member is not online */
VIDYO_CLIENT_SOAP_RESULT_NOT_OWNER_OF_ROOM,     /*!< Not owner of room */
VIDYO_CLIENT_SOAP_RESULT_USER_NOT_FOUND,        /*!< Specified user is not found */
VIDYO_CLIENT_SOAP_RESULT_UNEXPECTED_SUBELEMENT_IN_MESSAGE,  /*!< Unexpected sub element in SOAP message */
VIDYO_CLIENT_SOAP_RESULT_END_POINT_NOT_FOUND,   /*!< Endpoint not found */
VIDYO_CLIENT_SOAP_RESULT_FAILED_PLACE_DIRECT_CALL, /*!< Failed to place a direct call */
VIDYO_CLIENT_SOAP_RESULT_IPC_JOIN_FAILURE,      /*!< Failure to join room on other portal */
VIDYO_CLIENT_SOAP_RESULT_ALL_LINES_IN_USE,      /*!< All lines are in use */
} VidyoClientSoapResultCode;

我的Enum不包含26项,不知道是哪个错误。我该如何检查?

编辑:

我更改了我的日志以显示:

 VidyoClientSoapResultCode result = eventLicense->result;
 VidyoClientSoapFault fault = eventLicense->fault;
 VIDYO_CLIENT_LOG_INFO_FORMATTED("GuiOnOutEvent NDKMETHOD License Error: errorid=%d vmConnectionPath=%d OutOfLicense=%d Result=%d Fault=%d", error, vmConnectionPath, OutOfLicenses, result, fault);

只是为了确保我在记录为小数之前为它们创建了对象。 现在据我所知,对于 ENUM,十进制是记录方式,对吗? 但是,现在我得到了一个更奇怪的回应:

10-11 08:34:43.954: I/VidyoClinetLib(7103): 10-11 08:34:43.965 INFO  AppGui        GuiOnOutEvent NDKMETHOD License Error: errorid=0 vmConnectionPath=1 OutOfLicense=1 Result=21324 Fault=32 [ VidyoClientVcsoapThread_3, <unknown func>, app/src/main/jni/ndkVidyoSample.c:64 ]

也许这个新数据有帮助? 我的意思是 21324 看起来很奇怪,但它是一致的,现在每次出现错误时我都会得到这个。但它肯定不是像 Oliv 所说的 0:31

在看到 Demosthenes 的评论后,我记录了 ENUM 的所有值,它们确实是 0-16。 (17 个元素)。所以仍然有点困惑,也许我没有正确记录它?

通常,枚举实际上是从 0 开始初始化并递增 1(除非明确定义)。不确定这是否是编译器所需的行为,但在大多数系统上它肯定会那样工作。

这里有一些调试方法:

  1. 显式定义枚举值,即 =0=1 等。如果您仍然得到越界值,则您调用的函数有错误,确实 returns 一个越界值。如果不是,显然编译器不会用 0,1,...
  2. 初始化
  3. 考虑切换到类型安全的 C++(来自 C++11)变体:enum class。每当您在没有显式 static_cast 的类型和 int 之间进行转换时,编译器都会给您一个错误,而且仅使用枚举常量的名称(没有名称空间)也会出错。如果有一些奇怪的算法在进行,编译器会告诉你,一旦你修复了所有的编译错误(如果你引入了转换,考虑一下),你的代码可能会正确运行。