From: "Warren W. Gay VE3WWG" <ve3wwg@home.com>
Subject: Re: type Foo_ptr in new void*;
Date: Tue, 31 Jul 2001 05:02:05 GMT
Date: 2001-07-31T05:02:05+00:00 [thread overview]
Message-ID: <3B663BCD.A0CACD2@home.com> (raw)
In-Reply-To: 3B662129.D6055BAA@worldnet.att.net
James Rogers wrote:
> Tomasz Wegrzanowski wrote:
> > In article <3B64C26F.C195B4E0@worldnet.att.net>, James Rogers wrote:
> > > Yes, you are correct. C does allow you to forward declare a structure
> > > or a pointer without ever completing the definition. This is one of
> > > the nasty capabilities "provided" by C. You can even create an array
> > > of Foo *. However, pointer arithmetic from the start of this array
> > > produces unspecified behavior. What is the sizeof Foo? Since it is
> > > undefined, there is no correct answer to that question. Without a
> > > proper definition of the sizeof Foo, there can be no reliable pointer
> > > arithmetic.
> >
> > Correct answer is compilation error.
> > It's illegal to do pointer arith on void* or incomplete types.
Yes, that is correct (that it is illegal).
> It is illegal, but not necessarily caught by the compiler.
> This means that the correct answer is not compilation error.
> C compilers are actually pretty primitive in their understanding of
> data type completion. They rely on highly intelligent linkers to
> find all the completions. Unfortunately, linker diagnostic messages
Huh? What does linking have to do with pointer arithmetic and "incomplete
types"? I remember some bad C compilers (Aztec C on the Mac comes to
mind), but even the ever forgiving HP C compiler would catch this
kind of stuff (incomplete type and pointer arithmetic that is).
As far as allowing "undefined pointer arithmetic" without a compiler
warning or error, you need to cite specific compiler brands, and
show examples. Otherwise this is just rubbish, as far as I can see.
I've only seen error messages when pointer arithmetic is required for
incompletely defined types.
> If you do not TRULY know the type of the data pointed to by a void*,
> and then you cast it to some type, expecting correct results, you
> will sometimes get a nasty surprise. Pointer arithmetic will be
> performed, but your view of the data will be incorrect due to
> poor alignment problems.
Of course. If you cast _any_ pointer to another pointer type, you
cannot expect the arithmetic to be necessarily the same! So what's
the point? All C programmers know this already.
You as the C programmer have said "I know what I'm doing and I want
you the compiler to treat this address as a pointer to type Z, and
by golly, you better do pointer arithmetic according to the Z type."
After that, are you really surprised that the C compiler generates
code that does arithmetic on the pointer by type Z?
> Jim Rogers
> Colorado Springs, Colorado USA
C compilers (as with the C language), do have "issues". But not the
one you've chosen here.
--
Warren W. Gay VE3WWG
http://members.home.net/ve3wwg
next prev parent reply other threads:[~2001-07-31 5:02 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-07-29 4:31 type Foo_ptr in new void*; Tomasz Wegrzanowski
2001-07-29 5:56 ` tmoran
2001-07-29 8:57 ` Tomasz Wegrzanowski
2001-07-29 12:26 ` Marc A. Criley
2001-07-30 1:05 ` Tomasz Wegrzanowski
2001-07-30 1:20 ` tmoran
2001-07-30 2:09 ` James Rogers
2001-07-30 2:36 ` Warren W. Gay VE3WWG
2001-07-30 3:10 ` James Rogers
2001-07-31 2:14 ` Warren W. Gay VE3WWG
2001-07-31 1:21 ` Tomasz Wegrzanowski
2001-07-31 3:06 ` James Rogers
2001-07-31 5:02 ` Warren W. Gay VE3WWG [this message]
2001-07-31 7:22 ` Florian Weimer
2001-07-31 4:56 ` Darren New
2001-08-04 6:05 ` David Thompson
2001-08-05 2:27 ` Warren W. Gay VE3WWG
2001-07-29 13:40 ` Dale Stanbrough
2001-07-29 14:12 ` Florian Weimer
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox