передача большего количества параметров, чем указано в прототипе в C

Практикуюсь в чтении чужого кода, подобрал один из простейших пакетов в GNU core-utils, GNU да. coreutils-8.26, если быть точным, потому что моя машина — Debian Stretch. Прямые ссылки на код находятся в конце.

В main() у нас есть эта строка:

  parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
                  usage, AUTHORS, (char const *) NULL);

PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS должны быть просто некоторым макросом #define для постоянной c-строки, поэтому мы действительно передали здесь 8 параметров parse_long_options.

В long-options.h, который мы включили, мы объявили parse_long_options следующим образом, который принимает только 6 аргументов:

void parse_long_options (int _argc,
                     char **_argv,
                     const char *_command_name,
                     const char *_package,
                     const char *_version,
                     void (*_usage) (int),
                     /* const char *author1, ...*/ ...);

Итак, мой вопрос: как этот пакет, да, GNU, на самом деле компилируется и запускается? Это UB, по крайней мере, в C99. (1) Это только потому, что реализован GCC, и, следовательно, его следует избегать?

код прямых ссылок:

yes.c из coreutils-8.26: (2)

long-options.c из coreutils-8.26: (3)

long-options.h из coreutils-8.26: (4)

ftp GNU: (5)


person 陳矩翰    schedule 25.12.2018    source источник


Ответы (1)