我正在尝试构建树状菜单结构。
我将项目声明为:
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
}
};
我得到“初始化变量不是常量”。
我只是想知道构建常量静态菜单树的最佳方法是什么?
最佳答案
正如您所发现的,您不能使用变量的内容来初始化静态变量。但是您可以使用变量的地址来初始化静态变量。换句话说,创建指向对象的指针列表,而不是直接的对象列表。
但是,您很快就会发现维护起来相当笨拙。您将有很多变量需要处理。如果您必须更改 menu_item_struct
定义,则必须手动编辑所有初始化。因此,根据经验,避免在纯 C 中执行此操作。相反:
- 以您最喜欢的分层文本文件格式(JSON、XML 等)定义菜单。
- 使用你最喜欢的脚本语言(Python,...)读取文本文件,然后写出包含菜单变量的C文件。
- 编译生成的 C 文件并将生成的 C 文件与您的其他项目文件链接。
关于c - 在C中用树初始化结构的全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431362/