I have the following code:
int main(void)
{
struct { int x; } a, b;
struct { int x; } c;
struct { int x; } *p;
b = a; /* OK */
c = a; /* Doesn't work */
p = &a; /* Doesn't work */
return 0;
}
which fails to compile under GCC (3.4.6), with the following error:
test.c:8: error: incompatible types in assignment
test.c:9: warning: assignment from incompatible pointer type
Now, from what I understand (admittedly from the C99 standard), is that a
and c
should be compatible types, as they fulfill all the criteria in section 6.2.7, paragraph 1. I've tried compiling with std=c99
, to no avail.
Presumably my interpretation of the standard is wrong?
Addendum
Incidentally, this question arises because I wanted to declare some template-like macros to wrap various datatypes without the overhead of having to declare named types/typedefs everywhere, e.g. a trivial example:
#define LINKED_LIST(T) \
struct { \
T *pHead; \
T *pTail; \
}
...
LINKED_LIST(foo_t) list1;
LINKED_LIST(foo_t) list2;
...
LINKED_LIST(foo_t) *pList = &list1; /* Doesn't work */