【问题标题】:Const self-referential structuresconst 自引用结构
【发布时间】:2016-12-23 17:04:18
【问题描述】:

我正在用 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;

我需要像这样定义一系列变量:

menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5};
menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6};

等等。

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

noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;

等...,在一个函数的 .c 文件中,我已经初始化了变量:

void menu_init(void)
{
        menuEntry_1.text = title;
        menuEntry_1.up_entry = &menuEntry_2
}

其他成员和变量依此类推。

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

const noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;

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

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

【问题讨论】:

  • 如果你已经用menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5};初始化了变量,为什么还要在menu_init初始化它们?
  • 由于您的结构包含指向这些(全局)变量的指针,我相信您应该能够简单地定义它们并在一行中进行初始化,即无需具有初始化功能。 “每个变量都依赖于其他变量”是真的,但是如果你改变menuEntry_1的内容,并不意味着&menuEntry_1会改变。
  • @user694733 :如果我不将它们用作const,我会初始化menu_init 中的变量,但如果它们必须是const,我自然不会使用@987654336 @。我一直在寻找正确的方法!

标签: c struct constants self-reference


【解决方案1】:

如果你希望这些变量是const,那么你必须在没有函数的情况下进行初始化。

但首先,让我们处理类型定义中的const

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

然后是头文件的声明:

extern const noFunc_menuEntry menuEntry_1;
extern const noFunc_menuEntry menuEntry_2;
 ...

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

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};
 ...

【讨论】:

    【解决方案2】:

    你可以use an array,因为一堆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;
    }
    

    【讨论】:

    • 我认为这是完成这项任务的一种干净的方式。
    【解决方案3】:

    在标头的声明中使用extern constextern 只会声明程序中使用的变量,不会分配任何内存。 然后继续在 main 中定义它 const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多