Const自引用结构

BzF*_*zFr 8 c struct const self-reference

我在用C写作

我已经定义了一个由自引用结构组成的新类型(noFunc_menuEntry).

struct noFunc_menuEntry_tag {
    const char *text;
    struct noFunc_menuEntry_tag *up_entry;
    struct noFunc_menuEntry_tag *down_entry;
    struct noFunc_menuEntry_tag *back_entry;
    struct noFunc_menuEntry_tag *enter_entry;
};
typedef struct noFunc_menuEntry_tag noFunc_menuEntry;
Run Code Online (Sandbox Code Playgroud)

我需要定义一系列变量,如下所示:

menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5};
menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6};
Run Code Online (Sandbox Code Playgroud)

等等.

所以我需要分离变量的声明和定义,因为每个变量都依赖于其他变量.在头文件中,我写了声明

noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;
Run Code Online (Sandbox Code Playgroud)

etc ...,并在函数中的.c文件中初始化变量:

void menu_init(void)
{
        menuEntry_1.text = title;
        menuEntry_1.up_entry = &menuEntry_2
}
Run Code Online (Sandbox Code Playgroud)

等等其他成员和变量.

但是我希望我的变量是const:

const noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是关于separing声明和const我定义的类型变量的定义.我能怎么做?难道我做错了什么?

当然,如果我只是添加const声明,编译器在初始化变量时报告错误(我正在尝试编写只读变量).

use*_*733 6

如果您想要这些变量const,则必须在没有该函数的情况下进行初始化.

但首先,让我们处理constin类型定义:

typedef struct noFunc_menuEntry_tag noFunc_menuEntry;
struct noFunc_menuEntry_tag {
    const char *text;
    const noFunc_menuEntry *up_entry;
    const noFunc_menuEntry *down_entry;
    const noFunc_menuEntry *back_entry;
    const noFunc_menuEntry *enter_entry;
};
Run Code Online (Sandbox Code Playgroud)

然后是头文件的声明:

extern const noFunc_menuEntry menuEntry_1;
extern const noFunc_menuEntry menuEntry_2;
 ...
Run Code Online (Sandbox Code Playgroud)

最后是源文件中的定义和初始化:

const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5};
const noFunc_menuEntry menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6};
 ...
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 6

你可以使用一个数组,因为item_i你可能需要一堆暗示.

typedef struct noFunc_menuEntry_tag {
    const char *text;
    const struct noFunc_menuEntry_tag *up_entry;
    const struct noFunc_menuEntry_tag *down_entry;
    const struct noFunc_menuEntry_tag *back_entry;
    const struct noFunc_menuEntry_tag *enter_entry;
} noFunc_menuEntry;


int main(void) {
    const noFunc_menuEntry menuEntry[4] = {
        {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]},   
        {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]},   
        {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]},   
        {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]},   
    };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)