Преобразование% 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, если есть дополнительные трейлинг-аргументы, они просто оцениваются и игнорируются.