duplicate FILE typedef, stdio.h and wchar.h
Eric Blake
eblake@redhat.com
Wed Mar 4 16:35:00 GMT 2015
On 03/03/2015 09:05 PM, Craig Howland wrote:
> stdio.h and wchar.h both have unconditional "typedef FILE __FILE"
> declarations, which causes GCC to error out if both are included to the
> same
> source, which happens in any number of newlib source files. (For example,
> libc/stdlib/btowc.c.)
> The issue apparently was introduced with wchar.h version 1.34 on 23
> Dec 2013, when that typedef was added. (How I managed to not run into this
> error until now is a surprise.)
> The C99 standard does not specify FILE being defined in wchar.h, while
> POSIX has it listed as an extension to C. Both C and POSIX give synopses
> for wide-character functions which have FILE in the prototype as:
>
> #include <stdio.h>
> #include <wchar.h>
> [function]
>
> This implicitly says that FILE should not be defined in wchar.h to avoid
> duplication. And if it were to be put in per the POSIX CX, it would
> essentially always get protected out. (Makes you wonder why POSIX added
> it. GCC certainly does not need it, as evidenced by wchar.h being fine
> prior to Dec 2013 (all FILEs in wchar.h are FILE *).)
The C standard requires a strict C program to include both headers in
proper order. The POSIX standard explicitly went one step further, and
requires that <wchar.h> be self-standing and that a person can use it
without including <stdio.h>. This was an intentional design decision in
POSIX.
> Despite POSIX and C, Newlib source sometimes includes wchar.h first,
> partly because sometimes the inclusions of one or the other of the file are
> indirect.
And according to POSIX rules (but not stricter C rules) this should work.
> The question is, what is the right way to address the problem? Should
> it have the proper POSIX CX protection macro put on it? (But that, in
> itself
> would not fix the Newlib build issues that I'm seeing, since CX is often
> activated, I suspect.)
CX markings in POSIX mean something that POSIX requires of the
implementation above and beyond what C requires. There is no way to
disable CX extensions when compiling for a POSIX environment; the only
way to compile for an environment where CX is not present is to ditch
POSIX and compile for strictly ANSI C compliance. And we already know
that newlib is not (yet) very good at avoiding namespace pollution for
someone attempting to compile to just ANSI C compliance, because in
practice so few people are trying to use such a spartan environment.
> Revert the addition to wchar.h? (We got along fine
> before that, but then that bit of POSIX would be lacking, even if its
> desirability is questionable.) Add duplication-protection macros to both
> files, to allow both orders? (It would work, but is probably really not
> proper according to the C standard.)
Or factor out the FILE typedef into a separate internal header that both
<stdio.h> and <wchar.h> include, so that both public headers are
properly self-contained with regards to FILE all without having to
include one another.
> While I don't like it much, I've attached a patch for the latter
> solution under the assumption that it might be the preferred choice.
> (By the way, looking at GLIBC was of no help, as they do it in a bad
> way, including stdio.h in wchar.h--which is expressly forbidden by the
> standards.)
No, the standards (at least, the POSIX standard) do NOT forbid wchar.h
from including stdio.h:
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wchar.h.html#tag_13_83
"[CX] [Option Start] Inclusion of the <wchar.h> header may make visible
all symbols from the headers <ctype.h>, <string.h>, <stdarg.h>,
<stddef.h>, <stdio.h>, <stdlib.h>, and <time.h>. [Option End]"
which means, when compiling for POSIX, the namespace pollution is
perfectly acceptable, although not required.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://sourceware.org/pipermail/newlib/attachments/20150304/8d9548ac/attachment.sig>
More information about the Newlib
mailing list