用C中的树初始化结构的全局数组
我正在尝试构建树菜单结构 我宣布该项目为:用C中的树初始化结构的全局数组,c,arrays,menu,tree,C,Arrays,Menu,Tree,我正在尝试构建树菜单结构 我宣布该项目为: 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
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中执行此操作。相反: 用您喜欢的层次文本文件格式JSON、XML等定义菜单。。。。 使用您最喜欢的脚本语言Python。。。读取文本文件,然后写出包含菜单变量的C文件。 编译生成的C文件并将其与其他项目文件链接。
正如您所发现的,您不能使用变量的内容来初始化静态变量。但您可以使用变量的地址来初始化静态变量。换句话说,创建指向对象的指针列表,而不是对象的直接列表 然而,您很快就会发现,这是相当笨拙的维护。你会有很多变量,这些变量是你的地址。如果必须更改菜单项结构定义,则必须手动编辑所有初始化。因此,根据经验,避免在纯C中执行此操作。相反: 用您喜欢的层次文本文件格式JSON、XML等定义菜单。。。。 使用您最喜欢的脚本语言Python。。。读取文本文件,然后写出包含菜单变量的C文件。 编译生成的C文件并将其与其他项目文件链接。
当然不是。但我不明白你的问题。您的第一个声明不是常量,但在编译器理解中初始化器是常量。第二个在全局/静态范围内无效。问题是如何使第二个在全局范围内有效。或者任何其他构建大型多级menuYou的方法都不能使用变量初始化全局/静态变量。C不允许这样做,因为全局/静态变量是在主程序启动之前初始化的,并且初始化需要常量值。当然不是。但我不明白你的问题。您的第一个声明不是常量,但在编译器理解中初始化器是常量。第二个在全局/静态范围内无效。问题是如何使第二个在全局范围内有效。或者任何其他构建大型多级menuYou的方法都不能使用变量初始化全局/静态变量。C不允许这样做,因为全局/静态变量在主程序启动之前已初始化,且初始化需要常量值。谢谢。那可能是个解决办法谢谢。这可能是一个解决办法