Цитата(ARV @ Jul 29 2010, 12:35)

Жаль, что все знатоки Си, которых тут немало, не желают подсказать, в чем я не прав, и объяснить, как следует поступить... если компилятор описание структуры считает корректным, если доступ к полям происходит - что не так с инициализацией?
Ну вот сразу так "С".
Сами же сказали, что это расширение GNU, в C99 такого нет. Так что все претензии к "знатокам GCC", а "знатоков С" трогать не надо.
Кстати, чужая лень не нравится, но и самому лень было поместить в сообщении минимальный компилирующийся пример, чтобы всякие
Код
typedef struct {
uint8_t itemcount;
menu_item_t items[];
} menu_t;
не нужно было дописывать...
На мой взгляд, причина проста.
Пусть есть
Код
typedef union {
char c;
double d;
} u_t;
Её инициализировать вот так
Код
u_t foo = { 5.0 };
нельзя. Ну, можно, только результат будет эквивалентен
Код
u_t foo = { .c = (char)5.0 };
Т.е. при
инициализации объединения без C99-возможности указания имён полей инициализируется всегда
первое поле.
В структуре menu_item_t охватывающий union не имеет имён для полей-структур и инициализация летит в первое поле-структуру, а в этой структуре ну таки нет элемента .cnt.
Если переместить структуры в хвост объединения
Код
typedef struct {
prog_char *text;
uint8_t type;
union{
_tm submenu;
struct {
union{
uint8_t id;
int *num;
};
func_ptr func;
};
struct {
uint8_t vcnt;
uint8_t *vid;
prog_char **var;
};
};
} menu_item_t;
то и первая структура уже не будет инициализироваться.