此代码的输出打印出“成功”。
char d='w';
printf("%m\n", d);
答案 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是线程安全的!