duplicate typedefs and system headers ?

Luigi Rizzo rizzo at iet.unipi.it
Tue Jan 27 05:15:32 PST 2009


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


More information about the freebsd-current mailing list