C++中的特殊枚举

7cjasjjr  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(131)

在一个库中,我遇到了一个奇怪的结构,它可以用作枚举:

typedef struct SetControl
{
  const static uint16_t RC_MODE_ERROR;
  const static uint16_t RELEASE_CONTROL_SUCCESS;
  const static uint16_t OBTAIN_CONTROL_SUCCESS;
  const static uint16_t OBTAIN_CONTROL_IN_PROGRESS;
  const static uint16_t RELEASE_CONTROL_IN_PROGRESS;
  const static uint16_t RC_NEED_MODE_F;
  const static uint16_t RC_NEED_MODE_P;
  const static uint16_t IOC_OBTAIN_CONTROL_ERROR;
} SetControl;

成员不会在任何地方初始化,即使RC_MODE_ERROR等于0,RELEASE_CONTROL_SUCCESS等于1等等。我知道,因为我用printf记录了它。到目前为止我还没见过这样的东西。为什么它甚至工作(我认为值将被默认的随机数据初始化,或0)?与标准enum相比,这是否有任何附加价值?
接下来我可以尝试什么?

iyfamqjs

iyfamqjs1#

开始,这不是一个枚举,这是一个结构。这些是different concepts,但我想你知道,只是被这里的用法弄糊涂了。
结构体的成员不应该被赋给这些值(例如enum)。
我相当肯定这些成员在你的代码中的某个地方被初始化了,或者它们是宏,因此在某个地方被定义了。
搜索Github后,它们被初始化,如下所示:

const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::RC_MODE_ERROR = 0x0000;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::RELEASE_CONTROL_SUCCESS = 0x0001;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::OBTAIN_CONTROL_SUCCESS = 0x0002;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::OBTAIN_CONTROL_IN_PROGRESS = 0x0003;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::RELEASE_CONTROL_IN_PROGRESS = 0x0004;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::RC_NEED_MODE_F = 0x0006;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::RC_NEED_MODE_P = 0x0005;
const uint16_t DJI::OSDK::ErrorCode::ControlACK::SetControl::IOC_OBTAIN_CONTROL_ERROR = 0x00C9;

dji_error.cpp中。

wz3gfoph

wz3gfoph2#

静态成员需要单独定义。
例如:

// in example.h
struct SetControl
{
    const static uint16_t RC_MODE_ERROR; // this is only a declaration
};

// in example.cpp
const uint16_t SetControl::RC_MODE_ERROR = 1; // this is the definition

相关问题