Die Ausgabe für diesen Code gab „Erfolg“ aus.
printf("%m\n");
Manuel
Die Ausgabe für diesen Code gab „Erfolg“ aus.
printf("%m\n");
ouah
m
Konvertierungsspezifizierer ist nicht C, sondern eine GNU-Erweiterung von printf
:
Aus der GNU-Dokumentation:
http://www.gnu.org/software/libc/manual/html_node/Other-Output-Conversions.html
Die ‘%m’-Konvertierung gibt die Zeichenfolge aus, die dem Fehlercode in errno entspricht. Siehe Fehlermeldungen. Daher:
fprintf (stderr, "can't open `%s': %m\n", filename);
ist äquivalent zu:
fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
Die ‘%m’-Konvertierung ist eine Erweiterung der GNU C-Bibliothek.
So:
printf("%m\n", d);
ist äquivalent zu
printf("%s\n", strerror (errno), d);
was äquivalent ist
printf("%s\n", strerror (errno));
Beachten Sie, dass %m
erfordert keine Argumentation. Hier printf("%m\n", d)
und printf("%s\n", strerror (errno), d)
mehr Argumente als erforderlich haben: with printf
Wenn zusätzliche nachgestellte Argumente vorhanden sind, werden sie einfach ausgewertet und ignoriert.
Ich denke, der interessanteste Teil ist die Tatsache, dass printf dies tut nicht erfordern jeweils einen zusätzlichen Parameter %m
.
– luiskubal
13. Dezember 2013 um 23:15 Uhr
Rachid K.
Eigentlich das Handbuch von printf() betreffend %m ist ziemlich lakonisch:
m (Glibc extension; supported by uClibc and musl.) Print output
of strerror(errno). No argument is required.
Aber strerror()
hat ein Problem in Multithread-Programmen: Es ist nicht reentrant. Die Thread-sichere Version ist strerror_r().
Eine kleine Studie über die GLIBC-Implementierung zeigt, dass %m ist eigentlich äquivalent zu strerror_r() und nicht zu strerror(). Somit %m ist Thread-sicher! Das Online-Handbuch ist folglich falsch (oder zumindest nicht genau genug)!