【发布时间】:2010-06-16 08:58:04
【问题描述】:
正如标题所示,我质疑在结构中定义宏的原因。我经常在网络编程中看到这种方法,例如在 sn-p 之后:
struct sniff_tcp {
u_short th_sport; /* source port */
u_short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
u_char th_offx2; /* data offset, rsvd */
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
};
此示例来自 tcpdump 网站中的 sniffex.c 代码。
这是为了提高可读性和使代码更清晰吗?
【问题讨论】:
-
也许原作者喜欢放假后回来,不必查看不同的文件来回忆那些宏的含义。
-
如果是这种情况作者应该投资支持ctags的编辑器。
-
gcc 还有一个很棒的宏扩展功能。 (带 -E 选项)
-
@vpit3833:将宏放入结构或另一个文件中并不是唯一可能的选择。正常的方法是将宏放在同一个文件中,可能直接放在结构上方。
-
个人喜好。有些人喜欢在结构之前或之后定义的宏,有些人喜欢在内部定义的宏。我更喜欢内部,尤其是当一个结构可能有多个具有不同值集的字段时。不过,我同意其他人的观点,枚举适用于采用有限数量值之一的字段。