使用C中的树初始化struct的全局数组

时间:2017-08-01 07:20:03

标签: 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 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
    }
};

我得到"初始化变量不是常数"。

我只是想知道构建常量静态菜单树的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

如您所知,您无法使用变量的内容来初始化静态变量。但是您可以使用变量的地址来初始化静态变量。换句话说,创建指针列表到对象,而不是直接列出对象。

然而,你很快就会发现维持这种做法相当笨拙。您将获得许多变量。如果您必须更改menu_item_struct定义,则必须手动编辑所有初始化。所以,根据经验,避免在纯C 中这样做。代替:

  1. 以您喜欢的分层文本文件格式(JSON,XML,...)定义菜单。
  2. 使用您喜欢的脚本语言(Python,...)来读取文本文件,然后写出包含菜单变量的C文件。
  3. 使用其他项目文件编译并链接生成的C文件。