duplicate typedefs and system headers ?
Christoph Mallon
christoph.mallon at gmx.de
Tue Jan 27 14:59:23 PST 2009
Luigi Rizzo schrieb:
> In a recent commit tp sbin/ipfw, in an attempt to avoid
> a large set of header deependencies, i put a 'forward typedef'
> declaration in a common header, duplicating something that is in a
> system header:
>
> ipfw2.h: typedef struct _ipfw_insn ipfw_insn;
>
> netiinet/ip_fw2.h
> typedef struct _ipfw_insn { /* template for instructions */
> ...
> } ipfw_insn;
This just begs to break, if somebody decides to change the name of the
underlying type of the typedef.
> Sources including both ipfw2.h and /usr/include/netinet/ip_fw2.h
> However if the duplication occurs in two non-system files, the
> compiler produces an error for a duplicate typedef.
>
> Now i wonder, is there any compiler option to turn off the check
> for duplicate typedefs also for non-system headers ?
No. C forbids multiple typedefs of with the same name, even if they are
typedefs for the same type. (Side note: C++ allows this.)
> BTW the behaviour with duplicate typedefs is curious,
> you can try this for yourself with a simple example
> involving e.g. /usr/include/sha.h : make a copy of the file
> in userspace, and then you can try the following (SHA_CTX
> is typedef'ed in sha.h
>
> --- ok ---
> typedef struct SHAstate_st SHA_CTX;
> #include <sha.h>
>
> --- ok ---
> #include <sha.h>
> typedef struct SHAstate_st SHA_CTX;
>
> --- error ---
> #include "sha.h"
> typedef struct SHAstate_st SHA_CTX;
>
> --- error ---
> typedef struct SHAstate_st SHA_CTX;
> #include "sha.h"
>
> --- ok (this is surprising to me) --
> typedef struct SHAstate_st SHA_CTX;
> #include <sha.h>
> typedef struct SHAstate_st SHA_CTX;
>
> As you note, it looks like a typedef in a system header
> removes the error message for duplicates both before and after.
This is a misfeature in GCC and violates the C standard. Also it seems
that this misfeature has a bug, too, because it does not only affect
system headers, but the effects radiate into normal code, too.
Regards
Christoph
More information about the freebsd-current
mailing list