[3] Originally this was a static memory location, but macros are almost always used today to allow for multi-threading, so that each thread will see its own thread-local error number.
The header file also defines macros that expand to integer constants that represent the error codes.
The C standard library only requires three to be defined:[2] POSIX compliant operating systems like AIX, Linux or Solaris include many other error values, many of which are used much more often than the above ones, such as EACCES for when a file cannot be opened for reading.
[7] An errno can be translated to a descriptive string using strerror (defined in string.h) or a BSD extension called sys_errlist.
[8] The GNU C library (GLIBC) provides the additional POSIX error values macros in the header file errno.h.