Liste des Groupes | Revenir à cl c |
On 08/04/2025 18:32, Tim Rentsch wrote:I think the key point is that every time you define a struct with the struct keyword, it gets a "tag", if you don't provide it, it gets a private unnamable one, that is distinct. Thus you can't define a struct twice and get the exact same type, so every occurance ofbart <bc@freeuk.com> writes:I get an incompatible error (from the example you snipped) even when I remove both struct tags.
>On 08/04/2025 15:50, David Brown wrote:>
>On 08/04/2025 13:35, bart wrote:>
>But this need not be the case. For example this is module A:>
>
--------------------------
#include <stdio.h>
>
typedef struct point {float a; float b;} Point;
>
float dist(Point);
>
int main(void) {
Point p = {3, 4};
printf("%f\n", dist(p));
}
--------------------------
>
And this is module B that defines 'dist':
>
>
--------------------------
#include <math.h>
>
typedef float length;
typedef struct _tag {length x, y;} vector;
>
length dist(vector p) {return sqrt(p.x*p.x + p.y*p.y);}
--------------------------
>
The types involved are somewhat different, but are compatible
enough for it to work.
The two types are entirely compatible.
Are they?
No, they are not. The type names 'Point' and 'vector' name two
distinct types, and those types are not compatible, because
the two struct tags are different.
>
Because the two types are not compatible, even just calling the
function dist() is undefined behavior.
I can't use the same struct tag in the same scope as one will clash with the other. But if I have the second in an inner scope, then I again get the error.
It doesn't seem to be anything to do with struct tags.
Two typedefs for same struct layout appear to create distinct types; this fails:
typedef struct {float x, y;} Point;
typedef struct {float x, y;} vector;
Point p;
vector v;
p=v;
But this works:
typedef struct {float x, y;} Point, vector;
Point p;
vector v;
p=v;
So it seems to depend on whether Point and vector share the same internal descriptor for the struct.
In my original example, the structs were defined in separate translation unit, so the compiler has to take things on trust.
>
Les messages affichés proviennent d'usenet.