Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jan 2009 23:59:15 +0100
From:      Christoph Mallon <christoph.mallon@gmx.de>
To:        Luigi Rizzo <rizzo@iet.unipi.it>
Cc:        current@freebsd.org
Subject:   Re: duplicate typedefs and system headers ?
Message-ID:  <497F91C3.7040502@gmx.de>
In-Reply-To: <20090127132102.GA21574@onelab2.iet.unipi.it>
References:  <20090127132102.GA21574@onelab2.iet.unipi.it>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?497F91C3.7040502>