У меня есть следующий код:
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;
}
который не компилируется под GCC (3.4.6) со следующей ошибкой:
test.c:8: error: incompatible types in assignment
test.c:9: warning: assignment from incompatible pointer type
Теперь, из того, что я понимаю (по общему признанию, из стандарта C99), заключается в том, что a
и c
должны быть совместимыми типами, поскольку они соответствуют всем критериям в разделе 6.2.7, параграф 1. Я пробовал компиляция с std=c99
, безрезультатно.
Предположительно, моя интерпретация стандарта неверна?
Добавление
Кстати, этот вопрос возникает из-за того, что я хотел объявить некоторые шаблонные макросы, чтобы обернуть различные типы данных без накладных расходов, чтобы объявить имена типов /typedef всюду, например. тривиальный пример:
#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 */