Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Invalid sample definition for errno

18 views
Skip to first unread message

Keith Thompson

unread,
Nov 19, 2022, 9:08:17 PM11/19/22
to
A footnote in the section describing <errno.h> says:

The macro errno need not be the identifier of an object. It might
expand to a modifiable lvalue resulting from a function call (for
example, *errno()).

Footnotes are non-normative, and this one is presumably intended to be
informal, but that's not a valid macro definition for errno, both
because it's not fully protected by parentheses and because the function
can't be named "errno".

A valid definition (and the one used by glibc) is:

# define errno (*__errno_location ())

I suggest the footnote should be updated to use something like that
(though it needn't show the entire #define directive).

The same wording appears starting in C90 and up to and including the
latest C23 draft.

--
Keith Thompson (The_Other_Keith) Keith.S.T...@gmail.com
Working, but not speaking, for XCOM Labs
void Void(void) { Void(); } /* The recursive call of the void */

Tim Rentsch

unread,
Nov 20, 2022, 8:26:43 AM11/20/22
to
Keith Thompson <Keith.S.T...@gmail.com> writes:

> A footnote in the section describing <errno.h> says:
>
> The macro errno need not be the identifier of an object. It might
> expand to a modifiable lvalue resulting from a function call (for
> example, *errno()).
>
> Footnotes are non-normative, and this one is presumably intended to be
> informal, but that's not a valid macro definition for errno, both
> because it's not fully protected by parentheses and because the function
> can't be named "errno".

I see no reason the function couldn't be named "errno".

Keith Thompson

unread,
Nov 20, 2022, 4:58:31 PM11/20/22
to
My thought was that giving the function and the macro the same name
would cause a conflict, and I thought I had an example that demonstrated
it. Looking again, I was mistaken:

If the name of the macro being replaced is found during this scan of
the replacement list (not including the rest of the source file’s
preprocessing tokens), it is not replaced.

I still suggest that using the same name for both is needlessly
confusing.
0 new messages