Подтвердить что ты не робот

Каков смысл спецификатора форматирования% m?

Вывод для этого кода напечатан "Успех.

char d='w';
printf("%m\n", d);
4b9b3361

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