Sujet : Re: Struct Error
De : bc (at) *nospam* freeuk.com (bart)
Groupes : comp.lang.cDate : 26. Jan 2025, 20:14:00
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vn61ho$1pf2$1@dont-email.me>
References : 1 2 3 4
User-Agent : Mozilla Thunderbird
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.