我正在尝试构建树状菜单结构。
我宣布项目为:
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
}
};
我得到"初始化变量不是常数"。
我只是想知道构建常量静态菜单树的最佳方法是什么?
答案 0 :(得分:4)
如您所知,您无法使用变量的内容来初始化静态变量。但是您可以使用变量的地址来初始化静态变量。换句话说,创建指针列表到对象,而不是直接列出对象。
然而,你很快就会发现维持这种做法相当笨拙。您将获得许多变量。如果您必须更改menu_item_struct
定义,则必须手动编辑所有初始化。所以,根据经验,避免在纯C 中这样做。代替: