Ответ 1
m
Спецификатор преобразования не является C, а является расширением GNU для printf
:
Из документации GNU:
http://www.gnu.org/software/libc/manual/html_node/Other-Output-Conversions.html
Преобразование% m печатает строку, соответствующую коду ошибки в errno. См. Сообщения об ошибках. Таким образом:
fprintf (stderr, "can't open `%s': %m\n", filename);
эквивалентно:
fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
Преобразование% m является расширением библиотеки GNU C.
Итак:
printf("%m\n", d);
эквивалентно
printf("%s\n", strerror (errno), d);
что эквивалентно
printf("%s\n", strerror (errno));
Обратите внимание, что %m
не требует аргумента. Здесь printf("%m\n", d)
и printf("%s\n", strerror (errno), d)
имеют больше аргументов, чем требуется: с printf
, если есть дополнительные трейлинг-аргументы, они просто оцениваются и игнорируются.