From owner-freebsd-current@FreeBSD.ORG Tue Jan 27 13:15:31 2009 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DC5CC106567F for ; Tue, 27 Jan 2009 13:15:31 +0000 (UTC) (envelope-from luigi@onelab2.iet.unipi.it) Received: from onelab2.iet.unipi.it (onelab2.iet.unipi.it [131.114.9.129]) by mx1.freebsd.org (Postfix) with ESMTP id A43028FC21 for ; Tue, 27 Jan 2009 13:15:31 +0000 (UTC) (envelope-from luigi@onelab2.iet.unipi.it) Received: by onelab2.iet.unipi.it (Postfix, from userid 275) id 1D73573098; Tue, 27 Jan 2009 14:21:02 +0100 (CET) Date: Tue, 27 Jan 2009 14:21:02 +0100 From: Luigi Rizzo To: current@freebsd.org Message-ID: <20090127132102.GA21574@onelab2.iet.unipi.it> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.3i Cc: Subject: duplicate typedefs and system headers ? X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Jan 2009 13:15:32 -0000 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; 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 ? 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 --- ok --- #include 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 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. cheers luigi