What POSIX says is:
"Any conflict between the requirements described here and the ISO C
standard is unintentional."
...
"The symbol errno shall expand to a modifiable lvalue of type int. It is
unspecified whether errno is a macro or an identifier declared with
external linkage."
Section 17.5 paragraph 2 of the C standard lists the macros #defined in
<errno.h>, and errno is on that list. It goes on to specify that "errno
... expands to a modifiable lvalue 201) that has type int and thread
local storage duration ...".
Since the C standard explicitly describes errno as a macro, having it be
an "identifier declared with external linkage" would be in conflict with
the C standard's. As all such conflicts are explicitly declared to be
unintentional, that option presumably is not actually permitted.
However, the expansion of errno is allowed to be such an identifier.
The wording actually used, however, allows other possibilities, such as
# define errno (*__errno_location ())
which is how errno is defined in /usr/include/errno.h on my system.