Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jan 2009 14:21:02 +0100
From:      Luigi Rizzo <rizzo@iet.unipi.it>
To:        current@freebsd.org
Subject:   duplicate typedefs and system headers ?
Message-ID:  <20090127132102.GA21574@onelab2.iet.unipi.it>

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

	cheers
	luigi



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