微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这些C宏不是作为函数编写的?

我正在研究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,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()

解决方法

它读作实现可选IPv6支持的可怕想法.您必须通过历史记录确认,但存档似乎只回到1.46,隐含的损害是1.20.

我发现git存档可以追溯到1.24,它仍然存在.旧代码看起来很可疑.

BusyBox或BSD代码都不包含这样的混乱代码.所以它出现在Linux版本中,并遭受了重大的腐蚀.

原文地址:https://www.jb51.cc/c/118258.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐