c - 在C中用树初始化结构的全局数组

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

我得到“初始化变量不是常量”。

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

最佳答案

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

但是,您很快就会发现维护起来相当笨拙。您将有很多变量需要处理。如果您必须更改 menu_item_struct 定义,则必须手动编辑所有初始化。因此,根据经验,避免在纯 C 中执行此操作。相反:

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

关于c - 在C中用树初始化结构的全局数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431362/

相关文章:

css - 背景大小的变化取决于菜单的数量

javascript - javascript数组中添加的数据以后可以访问吗?

java - 数组搜索代码

java - C JNI 帮助处理复杂代码

c - Sentinel 不工作应该怎么办?

java - JSONArray在Android中将对象转换为数组找不到标签

html - 如何使隐藏列表项中的链接可点击

ios - 如何实现类似的菜单 View ? [iOS]

c - 通过引用调用指针不起作用

java - 没有特殊字符的字符串比较