C 什么';嵌入#define#x27的目的是什么;将其转换为结构定义?

C 什么';嵌入#define#x27的目的是什么;将其转换为结构定义?,c,linux,struct,C,Linux,Struct,在以下位置的结构定义中: 我发现: 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 send

在以下位置的结构定义中: 我发现:

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 .. */
};
struct serial\u rs485{
__u32标志;/*RS485功能标志*/
#定义SER_RS485_ENABLED(1它们不是“嵌入的”,它们恰好位于那里。这对
结构本身没有任何影响。请记住,预处理器在编译器看到代码之前运行;在代码编译之前,预处理器将被删除

这对于代码阅读器来说是有意义的,因为它将处理这些字段的
#define
放在附近

我认为它们不是最优的,因为符号的名称不会引用它们所关联的
struct
中的成员

因此,您将有代码执行:

struct serial_rs485 ser;

ser.flags = SER_RS485_ENABLED | SER_RS485_TERMINATE_BUS;
查看第二行的右侧如何不包含
标志
?如果同一结构有其他
定义
,则很容易将它们混淆

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

ser.flags = SER_RS485_FLAGS_ENABLED | SER_RS485_FLAGS_TERMINATE_BUS;

只是为了指出该结构中的标志是什么。这是为了读者,而不是编译器。这只是为了这个定义的人类读者而应用的引用原则的局部性。为什么不使用注释来实现同样的目的呢?@CinCout,你怎么能使用注释,在预处理之前用空格代替,来实现这个目的呢将文本替换为预处理器允许的任何内容?@CinCout-对宏列表的更改不会自动更新注释。宏必须位于某个位置。最好接近其预期用途。