关于 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(除非明确定义)。不确定这是否是编译器所需的行为,但在大多数系统上它肯定会那样工作。
这里有一些调试方法:
- 显式定义枚举值,即
=0
、=1
等。如果您仍然得到越界值,则您调用的函数有错误,确实 returns 一个越界值。如果不是,显然编译器不会用 0,1,... 初始化
- 考虑切换到类型安全的 C++(来自 C++11)变体:
enum class
。每当您在没有显式 static_cast
的类型和 int 之间进行转换时,编译器都会给您一个错误,而且仅使用枚举常量的名称(没有名称空间)也会出错。如果有一些奇怪的算法在进行,编译器会告诉你,一旦你修复了所有的编译错误(如果你引入了转换,考虑一下),你的代码可能会正确运行。
现在我有一个库返回给我一个包含枚举的结构。 现在,如果我尝试记录结果,我将得到:
代码:
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(除非明确定义)。不确定这是否是编译器所需的行为,但在大多数系统上它肯定会那样工作。
这里有一些调试方法:
- 显式定义枚举值,即
=0
、=1
等。如果您仍然得到越界值,则您调用的函数有错误,确实 returns 一个越界值。如果不是,显然编译器不会用 0,1,... 初始化
- 考虑切换到类型安全的 C++(来自 C++11)变体:
enum class
。每当您在没有显式static_cast
的类型和 int 之间进行转换时,编译器都会给您一个错误,而且仅使用枚举常量的名称(没有名称空间)也会出错。如果有一些奇怪的算法在进行,编译器会告诉你,一旦你修复了所有的编译错误(如果你引入了转换,考虑一下),你的代码可能会正确运行。