Remix.run Logo
Joker_vD 2 hours ago

> Now you have a naming problem. You need a naming convention that every user of the list library must follow, or else their types will be incompatible.

Oh, that's simple: just have empty struct tags.

> And what about typedefs?

The names introduced by the typedefs are irrelevant.

> A and B are typedef-related (their normal forms, obtained by following all typedefs, are the same), lists of A and B will be incompatible unless users agree on a common name.

Huh?

    typedef struct { int x; } A;
    typedef struct { int x; } B;

    typedef struct { header_list header; A payload; } list_of_A;
    typedef struct { header_list header; B payload; } list_of_B;
The structs list_of_A and list_of_B are compatible.
uecker 2 hours ago | parent | next [-]

No, any tagless type is unique, so neither A and B nor list_of_A and list_of_B are compatible.

This is what I like to fix in C2y outside of typedefs (and it would really help if you file wishlist bugs with compilers if you agree).

el_pollo_diablo 2 hours ago | parent | prev [-]

> The structs list_of_A and list_of_B are compatible.

No, they are not. From C23, 6.7.3.4 Tags: Each declaration of a structure, union, or enumerated type which does not include a tag declares a distinct type.

icedchai an hour ago | parent [-]

It depends what is meant by "compatible." Is the memory layout the same? Yes. Can I memcpy between them? Yes...

el_pollo_diablo 28 minutes ago | parent [-]

We mean compatible as defined by the C language standard. It is much more restrictive than having the same layout. In particular, you may not pass a pointer to a type where a pointer to an incompatible type is expected, even if the types have the same layout, which prevents the sort of sharing between two libraries that is being discussed.

Moreover, there is no guarantee that two distinct structure types with the same list of members have the same size or alignment (although in practice they do). The members must nevertheless be laid out in the same way (same offsets, and in the case of bit-fields, same layout inside storage units) due to an obscure constraint on common initial sequences. So the layouts of the structures may differ in the alignment requirement and the amount of trailing padding.