【发布时间】:2020-11-02 17:24:39
【问题描述】:
尝试将一些 C++ 代码转换为 C,我正在处理二进制数据,需要使用与此等效的 C:
enum GssipFlags : uint16_t
{
SPARE0 = 1,
SPARE1 = 2 * SPARE0,
SPARE2 = 2 * SPARE1,
SPARE3 = 2 * SPARE2,
REQ_MSG = 2 * SPARE3,
DISCONNECT = 2 * REQ_MSG,
CONNECT = 2 * DISCONNECT,
INVALID_DATA = 2 * CONNECT,
CMD_REJECT = 2 * INVALID_DATA,
HANDSHAKE = 2 * CMD_REJECT,
NAK_MSG = 2 * HANDSHAKE,
ACK_MSG = 2 * NAK_MSG,
ACK_REQ = 2 * ACK_MSG,
RESYNC = 2 * ACK_REQ,
MODE = 2 * RESYNC,
READY = 2 * MODE
};
enum GssipMessageIDs : uint16_t
{
CCCCCCCC = 1,
RECEIVER_ID_MSG = 2,
BUFFER_BOX_STATUS_REQUEST_MSG = 3,
SETUP_DATA_5031 = 4,
WARNING_MSG = 5,
TIME_TRANSFER = 6
};
enum GssipWarningMsgIDs : uint16_t
{
EXTERNAL_POWER_DISCONNECT = 17,
SELF_TEST_OK = 8,
AAAAA = 9,
BBBBB = 10
};
我尝试过的一切都没有奏效。我需要的主要方面是一切都是 uint16_t
【问题讨论】:
-
C 中不存在这类枚举。您需要使用显式的
uint16_t值。可能是typedef uint16_t GssipFlags,还有一堆#defines。 -
只需删除
: uint16_t。您可以将枚举分配给 uint16_t 变量 -
为什么你需要数字文字类型为
uint16_t? -
您可以像在 C++ 中一样定义枚举常量,尽管它们的类型为
int。但是枚举的类型是实现定义的,因此,如果您想在结构或其他任何内容中包含uint16_t字段,则需要显式使用uint16_t。例如,struct foo { uint16_t Flags, MessageID, WarningMsgID; } = { ACK_MSG, RECEIVER_ID_MSG, SELF_TEST_OK };应该可以工作。 -
如果您确实需要常量本身具有
uint16_t类型,您可以使用enum定义它们,然后添加诸如#define SPARE0 ((uint16_t) SPARE0)之类的宏。宏不会被递归替换,因此它只会扩展为((uint16_t) SPARE0),并且将具有所需的类型。