Re: duplicate typedefs and system headers ?

From: Christoph Mallon <christoph.mallon_at_gmx.de>
Date: Tue, 27 Jan 2009 23:59:15 +0100
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
Received on Tue Jan 27 2009 - 21:59:19 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:41 UTC