Mail Archives: djgpp/2003/08/29/08:00:11
From: | Martin Ambuhl <mambuhl AT earthlink DOT net>
|
User-Agent: | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)
|
X-Accept-Language: | en-us, en, de, fr, ru, el, zh
|
MIME-Version: | 1.0
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Re: struct bug?
|
References: | <bin4ql$sfh$1 AT newsreader1 DOT netway DOT at>
|
In-Reply-To: | <bin4ql$sfh$1@newsreader1.netway.at>
|
Lines: | 71
|
Message-ID: | <z3H3b.368$Om1.335@newsread2.news.atl.earthlink.net>
|
Date: | Fri, 29 Aug 2003 11:47:43 GMT
|
NNTP-Posting-Host: | 66.90.172.27
|
X-Complaints-To: | abuse AT earthlink DOT net
|
X-Trace: | newsread2.news.atl.earthlink.net 1062157663 66.90.172.27 (Fri, 29 Aug 2003 07:47:43 EDT)
|
NNTP-Posting-Date: | Fri, 29 Aug 2003 07:47:43 EDT
|
Organization: | EarthLink Inc. -- http://www.EarthLink.net
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Reply-To: | djgpp AT delorie DOT com
|
News Reader wrote:
> /*
> The following short source does not compile,
> because Gcc obviously has problems with
>
> sizeof("structured type member") .
>
> Although there is plenty of workaraound (just use
> a variable instead of the type), I am still keen to
> understand why the compiler can handle the entire
> structure (e.g. 'abt' as stated below), but not a
> structure member (e.g. 'abt.a').
>
> This looks like a bug to me, but I will gladly
> accept knowlegeable explanations of someone with
> more insight than myself.
It is not a bug in gcc, but in your understanding of the sizeof operator.
See below:
[// comments changed to newsgroup- and C89-friendly /* ... */]
> <...>
> typedef struct
> {
> int a;
> int b;
> } abt;
>
> <...>
> abt ab;
>
> /* Main() */
>
> int main()
> {
> printf("\n\n");
>
> printf("Sz(ab): %ld\n", sizeof(ab)); /* These compile, no
> problem */
> printf("Sz(ab.a): %ld\n", sizeof(ab.a));
> printf("Sz(abt): %ld\n", sizeof(abt)); /* this still
> compiles */
>
> printf("Sz(abt.a): %ld\n", sizeof(abt.a)); /* >>> BUT THIS
> ONE DOESN'T */
abt is a type. sizeof is not defined for members of a type,
but is for members of an object. Relevant to this is this from
6.5.3.4 of the draft version of the C99 standard:
6.5.3.4 The sizeof operator
Semantics
[#2] The sizeof operator yields the size (in bytes) of its
operand, which may be an expression or the parenthesized
name of a type. The size is determined from the type of the
operand. The result is an integer. If the type of the
operand is a variable length array type, the operand is
evaluated; otherwise, the operand is not evaluated and the
result is an integer constant.
Note that (ab) and (ab.a) are expressions, (abt) is a parenthesized name of a
type, but (abt.a) is neither.
--
Martin Ambuhl
- Raw text -