Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 Jun 2000 11:19:17 -0400 (EDT)
From:      Brian Fundakowski Feldman <green@FreeBSD.org>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/sys mbuf.h
Message-ID:  <Pine.BSF.4.21.0006041045370.543-100000@green.dyndns.org>
In-Reply-To: <Pine.BSF.4.21.0006040228200.9813-100000@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 4 Jun 2000, Bruce Evans wrote:

> I don't know how you learned that from me.  I've always said that caddr_t
> should have started going away around 1980 when K&R compilers started
> supporting void *.
> 
> Bruce

   Okay, let me see if I interpret your sparse explanation correctly =)


   The caddr_t type was created decades ago to represent a generic "core
address". It was originally defined to be equivalent to a pointer to a
char, as there was no type available which was more correct; caddr_t
became the pseudo- more correct type. Over the years, as more compilers
started supporting a pointer to a void, caddr_t was increasingly used so
that the proper type would be a type definition away.

   With caddr_t, old compilers could get the very moldy "everything can
be represented as a pointer to a char", and the new ones would get the
standardized:

       [#1] A pointer to void may be converted to or from a pointer  
       to  any  incomplete  or  object  type.   A  pointer  to  any
       incomplete or object type may be converted to a  pointer  to
       void  and  back again; the result shall compare equal to the
       original pointer.

   Therefore, caddr_t is a historical relic which, in its time, was
but a placeholder which made it easy to wait for proper implementation
of the feature desired.  It was always improper as a pointer to a char,
as the char * type was never guaranteed to be large enough to cast to
or from any other pointer type.  However, char * was all that existed
in all compilers.

   The void * type was created to duplicate what was wanted in a
generic address type (such as arithmetical semantics), while correctly
demonstrating that the type contained was an "unknown". The caddr_t type
should be phased out now since only an infinitesimal amount of compilers
can't support void *, and the void * type itself gives better type
checking then the caddr_t type definition.  In all cases, void * is to
be used instead of caddr_t in new code.


  How's my interpretation?  Be gentle, because I don't have any actual
knowledge to go on ;)

--
 Brian Fundakowski Feldman           \  FreeBSD: The Power to Serve!  /
 green@FreeBSD.org                    `------------------------------'




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0006041045370.543-100000>