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