Цитата(ARV @ Jul 29 2010, 14:48)

я ведь инициализирую с ЯВНЫМ указанием имен полей!!!
Полей. да не тех. Эти поля он ищет в первом элементе охватывающего объединения, так как имя поля
этого объединения не указано.
Ну когда допиливали GNU exts до неименованных полей, место с инициализацией union трогать почему-то не стали, оставили по стандарту.
Точнее, одну фишку добавили - "union cast", пример из предыдущего моего сообщения можно переписать так
Код
typedef union {
char c;
double d;
} u_t;
u_t foo = (u_t)5.0;
и оно чудненько сообразит проинициализировать double-часть.
Но в данном случае даже вместе с C99 compound literals оно не помогает, где-то задалбывается и литерал не считает константой (впрочем, кажется, по C99 compound literal есть отдельный неименованный временный объект, потому он и не рассматривается как констант
а). Компилировать с -fms-extensions, нужно для отмеченных мест
Код
typedef struct {
prog_char *text;
uint8_t type;
union outer { /* -fms-extensions */
struct simplei { /* -fms-extensions */
union{
uint8_t id;
int *num;
};
func_ptr func;
};
struct vari { /* -fms-extensions */
uint8_t vcnt;
uint8_t *vid;
prog_char **var;
};
_tm submenu;
};
} menu_item_t;
typedef struct {
uint8_t itemcount;
menu_item_t items[];
} menu_t;
enum { i_simple, i_int, i_var, i_sub };
#define simple_item(t,i,f) {.text = t, .type = i_simple, (union outer)(struct simplei){{.id=i}, .func = f} }
#define int_item(t,n,f) {.text = t, .type = i_int, (union outer)(struct simplei){{.num = n}, .func = f} }
#define var_item(t,c,vi,v) {.text = t, .type = i_var, (union outer)(struct vari){.vcnt=0} }
#define sub_item(t,s) {.text = t, .type = i_sub, {.submenu = s}}
Цитата
uni_2.c:53: error: initializer element is not constant
uni_2.c:53: error: (near initialization for ‘mainmenu.items[0].<anonymous>’)
и для остальных элементов то же самое