Name | Description | Notes | Source | Availability | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
errno_t |
Error-number type | ? | T | Headers | C11 | ||||||
perror() |
Report last error | (·) | <stdio.h> |
C89 | C90 | C95 | C99 | C11 | |||
strerror() |
Interpret error number | (·) | <string.h> |
C89 | C90 | C95 | C99 | C11 | |||
strerror_s() |
Interpret error number | ? | (·) | <string.h> |
C11 | ||||||
strerrorlen_s() |
Get length of message interpreting error number | ? | (·) | <string.h> |
C11 |
Name | Description | Notes | Source | Availability | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
EDOM |
Domain-error indicator | M | <errno.h> |
C89 | C90 | C95 | C99 | C11 | |||
EILSEQ |
Indicator of illegal multibyte sequence | M | <errno.h> |
C95 | C99 | C11 | |||||
ERANGE |
Range-error indicator | M | <errno.h> |
C89 | C90 | C95 | C99 | C11 | |||
errno |
Holder of last error number | <errno.h> |
C89 | C90 | C95 | C99 | C11 |
Many standard library functions, when they report an
error, also set what appears to be (and may actually be) a
global variable called errno
,
which has type int
, and holds
an error code. A correct declaration for errno
is available in <errno.h>
. To use it
properly, you need to adopt the following idiom:
errno = 0; double result = atan2(y, x); if (errno) { /* Handle error. */ }
atan2
and other functions
in <math.h>
, but there are
plenty of cases where a difinitive return code tells you
there's an error.]
errno
is not set if there is no error, and might not be set even if
there is! (math_
might be
able to tell you more.) A number of error codes are defined,
but zero is never one of them, so this is a safe default. The
standard defines a small number of codes, like EDOM
and ERANGE
, but implementations may
define many more, all with names beginning with E
. The standard error codes are:
Macros with names matching ^E[0-9A-Z]
might be added to <errno.h>
.
errno_t
is an
optional type
alias for int
, and is
used in the return types of some functions, to document that
error codes are returned, rather than setting the global
errno
.
__STDC_
can be used to determine the existence of errno_t
.
errno_t
are specified as simply returning non-zero on error, not
requiring it to be one of the E-prefixed
codes. So the analogy with errno
might not be generally correct.]
Several functions are available to convert an error code into a locale-specific string:
#include <string.h>
char *strerror(int errnum);
#define __STDC_WANT_ 1 #includeLIB_ EXT1__ <string.h>
errno_t strerror_s(char *s, rsize_t maxsize, errno_t errnum); size_t strerrorlen_s(errno_t errnum);
strerror
takes an error code, and returns a pointer to a message
describing the error, according to the
LC_MESSAGES locale category. strerror_s
generates the same message, but writes it into the array of
at least maxsize
bytes at s
, returning zero if the array was big enough, or
non-zero if not. Provided maxsize
is
not zero, a null-terminated string will always be written
into the array, possibly truncated.
strerrorlen_s
can be used to find out how big
the array needs to be for a specific error code, not
including the terminating null character.
#include <stdlib.h>
void perror(const char *s);
perror
reads
the current value of errno
,
and writes to stderr
the message that strerror
would provide. The null-terminated string s
also forms part of the message (e.g., perror("Computing
angle")
could write Computing angle: Domain
error), if not null or zero-length.