Почему эти макросы C не записаны как функции?

Я изучаю код инструмента netstat (Linux), который AFAIK в основном читает / proc / net / tcp файл и dowa красиво распечатывает его. (Сейчас я сосредоточен на режиме -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()
7
задан PypeBros 25 August 2011 в 11:18
поделиться