将#define嵌入到结构定义中的目的是什么?

zze*_*roo 0 c linux struct

在以下结构定义中:http://elixir.free-electrons.com/linux/latest/source/include/uapi/linux/serial.h#L116 我发现了这个:

struct serial_rs485 {
    __u32   flags;          /* RS485 feature flags */
#define SER_RS485_ENABLED       (1 << 0)    /* If enabled */
#define SER_RS485_RTS_ON_SEND       (1 << 1) /* Logical level for RTS pin when sending */
#define SER_RS485_RTS_AFTER_SEND    (1 << 2) /* Logical level for RTS pin after sent*/
#define SER_RS485_RX_DURING_TX      (1 << 4)
#define SER_RS485_TERMINATE_BUS     (1 << 5) /* Enable bus termination (if supported) */
    __u32   delay_rts_before_send;  /* Delay before send (milliseconds) */
    __u32   delay_rts_after_send;   /* Delay after send (milliseconds) */
    __u32   padding[5];     /* Memory is cheap, new structs
                       are a royal PITA .. */
};
Run Code Online (Sandbox Code Playgroud)

嵌入#define结构定义的目的是什么?

unw*_*ind 7

它们不是"嵌入式"的,它们恰好位于那里.这对struct自己没有任何作用.请记住,预处理器编译器看到代码之前运行; 这些将在代码编译之前被删除.

它对代码阅读器有意义,因为它保留了#define处理这些字段的s.

我认为它们不是最优的,因为符号的名称不会引用struct它们所涉及的成员.

所以你会有代码在做:

struct serial_rs485 ser;

ser.flags = SER_RS485_ENABLED | SER_RS485_TERMINATE_BUS;
Run Code Online (Sandbox Code Playgroud)

看看第二行的右侧不包含FLAG哪些内容?如果define同一结构中还有其他s,则很容易将它们混合起来.

通常你添加字段的名称,使其成为:

ser.flags = SER_RS485_FLAGS_ENABLED | SER_RS485_FLAGS_TERMINATE_BUS;
Run Code Online (Sandbox Code Playgroud)