gpt4 book ai didi

c - 为什么这些常量以不同的方式声明?

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:08 27 4
gpt4 key购买 nike

下面是声明了很多常量的代码:

#define TD_DATA_PID               0  /* control pipe state for td_sie_done */
#define TD_STATUS_PID 2 /* control pipe state for td_sie_done */
#define TD_DONE_PID 4 /* control pipe state for td_sie_done */
#define TD_DELETE_PID 0xee /* pipe command for td_sie_done */
#define TD_SETUP_PID 0xd /* also used for control pipe state for tf_sie_done */
#define TD_IN_PID 0x9
#define TD_OUT_PID 0x1
#define TD_SOF_PID 0x5
#define TD_PREAMBLE_PID 0xc
#define TD_NAK_PID 0xa
#define TD_STALL_PID 0xe
#define TD_DATA0_PID 0x3
#define TD_DATA1_PID 0xb

#define TD_NORMAL_TIMEOUT 0
#define TD_LONG_TIMEOUT 1

enum TD_CTRL_BITS
{
TD_CTRL_ARM = 0x01,
TD_CTRL_ISOCH = 0x10,
TD_CTRL_SYNC_SOF = 0x20,
TD_CTRL_DTOGGLE = 0x40,
TD_CTRL_PREAMBLE = 0x80
};


enum TD_STATUS_BITS
{
TD_STATUS_ACK = 0x01,
TD_STATUS_ERROR = 0x02,
TD_STATUS_TIMEOUT = 0x04,
TD_STATUS_SEQ = 0x08,
TD_STATUS_SETUP = 0x10,
TD_STATUS_OVERFLOW = 0x20,
TD_STATUS_NAK = 0x40,
TD_STATUS_STALL = 0x80
};

此代码用于 USB OTG Controller 、低级嵌入式系统,因此使用 C 而不是 C++。

所有的#define 值都用于为单个单字节变量赋值。该变量是数据包 ID,因此所有#define 常量都以 _PID 结尾。这很清楚。

但是enums的部分不清楚。

基本上,有一个包含 TD_CONTROL_BITS 的单字节长寄存器,可能需要读/写它。每个位都会影响硬件的行为。赋予枚举中每个常量的值是对应于该函数的位,例如 ARM 位是位 0,等时传输位是位 2 等。读取和写入该寄存器。

同样适用于 TD_STATUS_BITS。字节长状态寄存器中的每一位都提供有关传输状态的独立信息。因此,常量 TD_STATUS_ACK、TD_STATUS_ERROR 等可以用作位掩码来读取状态寄存器。该寄存器仅在由外部硬件更新时才被回读,并且仅写入 0 值以对其进行重置。

现在我的问题是,为什么不对所有内容都使用#define 常量呢?在这种情况下枚举带来了什么好处?此外,在 TD_CTRL_BITS 的情况下,我们可能希望将位逻辑或在一起,例如 TD_CTRL_ARM | TD_CTRL_DTOGGLE。我认为枚举不允许这样做。

最佳答案

这是一个非常标准的编码约定,您会在您的职业生涯中多次看到它。

使用枚举是一种关联一堆标志的方法,这样您就可以知道它们属于一起。从代码中可以清楚地看出哪些是控制标志,哪些是状态标志,因为它在枚举标签中这样说。一些语言甚至强制标志类型,以便只有控制标志可以与控制参数一起使用,而与状态标志相同。 C# 可以做到这一点,我不认为 C 可以,C++ 可以。

更易读的代码是一件好事,因为它意味着更少的错误和更少的维护开销

关于c - 为什么这些常量以不同的方式声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42239744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com