Was bedeutet der Formatierungsbezeichner %m?

Lesezeit: 1 Minute

Benutzeravatar von Manuel
Manuel

Die Ausgabe für diesen Code gab „Erfolg“ aus.

printf("%m\n");

Benutzeravatar von ouah
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 %merfordert 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

Benutzeravatar von Rachid K
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)!

1411430cookie-checkWas bedeutet der Formatierungsbezeichner %m?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy