我正在嘗試構建樹形菜單結構。初始化全局數組的結構樹C
我聲明項:
typedef struct menu_item_struct menu_item;
typedef int (*menu_action) (menu_item *item);
typedef bool (*menu_is_selected) (menu_item *item);
struct menu_item_struct{
char *text;
menu_action action;
menu_is_selected is_selected;
int subitems_count;
int id;
menu_item *subitems;
menu_item *parent;
};
首先我想這個代碼,它工作得很好:
menu_item main_menu = {
.text = "Top level",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = 3,
.subitems = &(menu_item[3])
{
{
.text = " ..",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = -1,
.subitems = 0
},
{
.text = "Subitem 1 level 1",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = 2,
.subitems = &(menu_item[2])
{
{
.text = " ..",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = -1,
.subitems = 0
},
{
.text = "Sub 1 item level 2",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = 0,
.subitems = 0
}
}
},
{
.text = "Subitem 1 level 1",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = -1,
.subitems = 0
}
}
};
這是確定的小菜單。但是對於大的我試圖把它分成幾個變量。例如。 「後退」項目出現在所有子菜單中。所以,現在
menu_item menu_back = {
.text = " ..",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = -1,
.subitems = NULL
};
當我嘗試
menu_item main_menu = {
.text = "Menu",
.action = 0,
.parent = 0,
.id = 0,
.subitems_count = 1,
.subitems = &(menu_item[1]) {
menu_back
}
};
我得到「初始化變量不是一個常量」:因此,我宣佈它作爲獨立的變量。
我只是想知道構建常量靜態菜單樹的最佳方式是什麼?
當然不是。但我不明白你的問題。你的第一個聲明並不是恆定的,但初始化者在編譯器理解中是不變的。第二個在全局/靜態作用域中無效。 –
問題是如何使第二個在全球範圍內有效。 或任何其他方法來構建大型多級菜單 –
您不能使用變量來初始化全局/靜態變量。 C不允許這樣做,因爲全局/靜態變量在主程序啓動之前被初始化,並且初始化需要常量值。 –