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.