Namespaces
Variants

errno

From cppreference.net
< c ‎ | error
Definiert im Header <errno.h>
#define errno /* implementation-defined */

errno ist ein Präprozessor-Makro (siehe jedoch Hinweis unten), das zu einem thread-lokalen (seit C11) modifizierbaren L-Wert vom Typ int expandiert. Mehrere Standardbibliotheksfunktionen zeigen Fehler an, indem sie positive Ganzzahlen in errno schreiben. Typischerweise wird der Wert von errno auf einen der Fehlercodes gesetzt, die in <errno.h> als Makrokonstanten aufgeführt sind, die mit dem Buchstaben E beginnen, gefolgt von Großbuchstaben oder Ziffern.

Der Wert von errno ist 0 beim Programmstart, und obwohl Bibliotheksfunktionen positive Ganzzahlen in errno schreiben dürfen, unabhängig davon, ob ein Fehler aufgetreten ist, speichern Bibliotheksfunktionen niemals 0 in errno .

Bibliotheksfunktionen perror und strerror können verwendet werden, um textuelle Beschreibungen der Fehlerzustände zu erhalten, die dem aktuellen errno -Wert entsprechen.

Hinweis: Bis C11 hatten die C-Standards widersprüchliche Anforderungen, da sie sagten, dass errno ein Makro ist, aber auch dass "es nicht spezifiziert ist, ob errno ein Makro oder ein Bezeichner mit externer Bindung ist". C11 behebt dies, indem es vorschreibt, dass es als Makro definiert werden muss (siehe auch WG14 N1338 ).

Beispiel

#include <errno.h>
#include <math.h>
#include <stdio.h>
void show_errno(void)
{
    const char *err_info = "unknown error";
    switch (errno)
    {
        case EDOM:
            err_info = "domain error";
            break;
        case EILSEQ:
            err_info = "illegal sequence";
            break;
        case ERANGE:
            err_info = "pole or range error";
            break;
        case 0:
            err_info = "no error";
    }
    fputs(err_info, stdout);
    puts(" occurred");
}
int main(void)
{
    fputs("MATH_ERRNO is ", stdout);
    puts(math_errhandling & MATH_ERRNO ? "set" : "not set");
    errno = 0;
    (void)(1.0 / 0.0);
    show_errno();
    errno = 0;
    (void)acos(+1.1);
    show_errno();
    errno = 0;
    (void)log(0.0);
    show_errno();
    errno = 0;
    (void)sin(0.0);
    show_errno();
}

Mögliche Ausgabe:

MATH_ERRNO is set
no error occurred
domain error occurred
pole or range error occurred
no error occurred

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.5 Fehler <errno.h> (S: TBD)
  • K.3.1.3 Verwendung von errno (S: TBD)
  • K.3.2 Fehler <errno.h> (S: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.5 Errors <errno.h> (S: TBD)
  • K.3.1.3 Verwendung von errno (S: TBD)
  • K.3.2 Errors <errno.h> (S: TBD)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.5 Errors <errno.h> (S. 205)
  • K.3.1.3 Verwendung von errno (S. 584)
  • K.3.2 Errors <errno.h> (S. 585)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.5 Errors <errno.h> (S: 186)
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • 4.1.3 Fehler <errno.h>

Siehe auch

Makros für standardkonforme POSIX-Fehlercodes
(Makrokonstante)
gibt eine Zeichenkette entsprechend des aktuellen Fehlers an stderr aus
(Funktion)
gibt eine Textbeschreibung zu einem gegebenen Fehlercode zurück
(Funktion)
definiert den Fehlerbehandlungsmechanismus für gemeinsame mathematische Funktionen
(Makrokonstante)