%m格式说明符的含义是什么?

时间:2013-12-13 23:10:21

标签: c printf

此代码的输出打印出“成功”。

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

2 个答案:

答案 0 :(得分:40)

m转换说明符不是C,但是printf的GNU扩展名:

来自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只会评估和忽略它们。

答案 1 :(得分:1)

实际上,关于{strong>%m 的printf()手册非常简洁:

m      (Glibc extension; supported by uClibc and musl.)  Print output
              of strerror(errno).  No argument is required.

但是strerror()在多线程程序中有一个问题:它不是可重入的。线程安全版本为strerror_r()

GLIBC implementation的一项研究表明,%m 实际上等同于strerror_r()。因此%m是线程安全的