在以下结构定义中: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结构定义的目的是什么?
它们不是"嵌入式"的,它们恰好位于那里.这对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)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |