【发布时间】:2011-08-23 09:16:31
【问题描述】:
我正在研究 netstat 工具 (Linux) 的代码,AFAIK 主要读取 /proc/net/tcp 文件并漂亮地打印出来。 (我现在的重点是 -t 模式。)
作者选择的编码风格让我有点困惑:
static int tcp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)", tcp_do_one);
}
在哪里
#define INFO_GUTS6(file,file6,name,proc) \
char buffer[8192]; \
int rc = 0; \
int lnr = 0; \
if (!flag_arg || flag_inet) { \
INFO_GUTS1(file,name,proc) \
} \
if (!flag_arg || flag_inet6) { \
INFO_GUTS2(file6,proc) \
} \
INFO_GUTS3
在哪里
#define INFO_GUTS3 \
return rc;
和
#if HAVE_AFINET6
#define INFO_GUTS2(file,proc) \
lnr = 0; \
procinfo = fopen((file), "r"); \
if (procinfo != NULL) { \
do { \
if (fgets(buffer, sizeof(buffer), procinfo)) \
(proc)(lnr++, buffer); \
} while (!feof(procinfo)); \
fclose(procinfo); \
}
#else
#define INFO_GUTS2(file,proc)
#endif
等等
显然,我的编码意识是倾斜的,并说“那些应该是函数”。我看不到这些宏在这里带来的任何好处。它会破坏可读性等。
周围有没有人熟悉这段代码,可以解释一下“INFO_GUTS”是什么意思,以及这种奇怪的编码风格是否可能(或仍然有)原因?
如果您对它们的使用感到好奇,完整的依赖关系图如下所示:
# /---> INFO_GUTS1 <---\
# INFO_GUTS --* INFO_GUTS2 <----*---- INFO_GUTS6
# î \---> INFO_GUTS3 <---/ î
# | |
# unix_info() igmp_info(), tcp_info(), udp_info(), raw_info()
【问题讨论】:
标签: c networking coding-style macros