在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
嵌入到结构定义中的目的是什么?
答案 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;