为什么这些C宏不能写成函数?

Pyp*_*ros 7 c macros networking coding-style

我正在研究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);
}
Run Code Online (Sandbox Code Playgroud)

哪里

#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
Run Code Online (Sandbox Code Playgroud)

哪里

 #define INFO_GUTS3                                      \
  return rc;
Run Code Online (Sandbox Code Playgroud)

#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
Run Code Online (Sandbox Code Playgroud)

等等

显然,我的编码意义是倾斜,并说"那些应该是功能".我认为这些宏带来的任何好处都没有.它会杀死可读性等

是否有人熟悉这个代码,可以阐明"INFO_GUTS"在这里是什么,是否可能(或仍然有)这种奇怪编码风格的原因?

如果您对它们的使用感到好奇,那么完整的依赖图就像这样:

#               /--->   INFO_GUTS1  <---\    
#  INFO_GUTS --*        INFO_GUTS2  <----*---- INFO_GUTS6
#      î        \--->   INFO_GUTS3  <---/           î 
#      |                                            |
# unix_info()              igmp_info(), tcp_info(), udp_info(), raw_info()
Run Code Online (Sandbox Code Playgroud)

Ste*_*e-o 1

实施可选的 IPv6 支持听起来是个糟糕的想法。你必须浏览历史才能确认,但存档似乎只返回到 1.46,而隐含伤害为 1.20+。

我发现了一个可以追溯到 1.24 的 git 存档,它仍然存在。较旧的代码看起来很可疑。

BusyBox 或 BSD 代码都不包含如此混乱的代码。因此它出现在 Linux 版本中并遭受了严重的损坏。