Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C中的树初始化结构的全局数组_C_Arrays_Menu_Tree - Fatal编程技术网

用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不允许这样做,因为全局/静态变量在主程序启动之前已初始化,且初始化需要常量值。谢谢。那可能是个解决办法谢谢。这可能是一个解决办法