Deutsch   English   Français   Italiano  
<vn61ho$1pf2$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: bart <bc@freeuk.com>
Newsgroups: comp.lang.c
Subject: Re: Struct Error
Date: Sun, 26 Jan 2025 19:14:00 +0000
Organization: A noiseless patient Spider
Lines: 71
Message-ID: <vn61ho$1pf2$1@dont-email.me>
References: <vmr5gg$137jo$1@dont-email.me> <vms4km$19srg$1@dont-email.me>
 <vmt74h$1jac0$1@dont-email.me> <20250124163740.00006281@yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Sun, 26 Jan 2025 20:14:01 +0100 (CET)
Injection-Info: dont-email.me; posting-host="60899ec5a2297e2ca479141e9f8d9cb6";
	logging-data="58850"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/LGDh2Tu548Vens6GVBlNc"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:B/3caMrtjvYHrbqpYMx3gJ7V2QY=
Content-Language: en-GB
In-Reply-To: <20250124163740.00006281@yahoo.com>
Bytes: 3329

On 24/01/2025 14:37, Michael S wrote:
> On Thu, 23 Jan 2025 10:54:10 +0000
> bart <bc@freeuk.com> wrote:
> 
>> On 23/01/2025 01:05, James Kuyper wrote:
>>> On 2025-01-22, bart <bc@freeuk.com> wrote:
>>>> Gcc 14.1 gives me an error compiling this code:
>>>>
>>>>      struct vector;
>>>>      struct scenet;
>>>>
>>>>      struct vector {
>>>>          double x;
>>>>          double y;
>>>>          double z;
>>>>      };
>>>>
>>>>      struct scenet {
>>>>          struct vector center;
>>>>          double radius;
>>>>          struct scenet (*child)[];
>>>>      };
>>>
>>> 6.7.6.2p2: "The element type shall not be an incomplete or function
>>> type."
>>>
>>> I have many draft versions of the C standard. n2912.pdf, dated
>>> 2022-06-08, says in 6.7.2.1.p3 about struct types that "... the
>>> type is incomplete144) until immediately after the closing brace of
>>> the list defining the content, and complete thereafter."
>>>
>>> Therefore, struct scenet is not a complete type until the closing
>>> brace of it's declaration.
>>
>> Wouldn't this also be the case here:
>>
>>      struct scenet *child;
>>     };
>>
> 
> Just to point out if it was not said already: the problem is not related
> specifically to recursive structures. It applies to arrays of
> incomplete types in all circumstances.
> 
> struct bar;
> struct bar (*bag)[]; // error
> typedef struct bar (*bat)[]; // error

I don't think anyone has yet explained why that is an error (other than 
C says it is), but not this:

   struct bar *ptr;

This is a pointer to an incomplete type. Attempts to do ++ptr for 
example will fail later on if that struct has not yet been defined.

So why not the same for the pointer-to-array versions?

It just doesn't make sense.

Is it just because such pointers HAVE to work, otherwise 
self-referential structs become impossible? That would make it a hack, 
in which case why not apply it to arrays too?


> The case of the recursive structure is special only in a sense that it's
> o.k. in C++, because [unlike C] in C++ struct considered complete within
> its own body.

For non-recursive, you can choose to declare the pointer-to-array after 
the struct has been fully defined.