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

时间:2017-09-27 10:16:20

标签: 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 .. */
};

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

1 个答案:

答案 0 :(得分:7)

他们不是&#34;嵌入&#34;,他们恰好位于那里。这对struct本身没有任何作用。请记住,预编译器在编译器看到代码之前运行;这些将在代码编译之前被删除。

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

我认为它们不是最佳的,因为符号的名称不会引用struct中与其相关的成员。

所以你有代码在做:

struct serial_rs485 ser;

ser.flags = SER_RS485_ENABLED | SER_RS485_TERMINATE_BUS;

了解第二行的右侧如何包含FLAG?如果同一结构中还有其他define个,则很容易将它们混合起来。

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

ser.flags = SER_RS485_FLAGS_ENABLED | SER_RS485_FLAGS_TERMINATE_BUS;