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) list1;
LINKED_LIST(foo) list2;
...
LINKED_LIST(foo) *pList = &list1; /* Doesn't work */
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…