循环依赖结构,使用正向声明时重新定义结构时出错 下面的代码在C中编译,使用Keil下的ARMCC,但是在Eclipse中使用G++,不能在C++中编译。原始代码中有一些const关键字,但这似乎导致了另一个不太重要的问题,所以我暂时删除了它们 struct MENU { struct MENU * NextMenu; struct MENU * PrevMenu; void (* InitFunction)(void); }; typedef struct MENU MENU_T; MENU_T MENU_A; // <- this forward declaration is needed for circular reference between structs MENU_T MENU_B; MENU_T MENU_C; MENU_T MENU_A = // <- However redefinition error occurs here { .NextMenu = &MENU_B, .PrevMenu = &MENU_C, .InitFunction = 0, }; MENU_T MENU_B = { .NextMenu = &MENU_C, .PrevMenu = &MENU_A, .InitFunction = 0, }; MENU_T MENU_C = { .NextMenu = &MENU_A, .PrevMenu = &MENU_B, .InitFunction = 0, };

循环依赖结构,使用正向声明时重新定义结构时出错 下面的代码在C中编译,使用Keil下的ARMCC,但是在Eclipse中使用G++,不能在C++中编译。原始代码中有一些const关键字,但这似乎导致了另一个不太重要的问题,所以我暂时删除了它们 struct MENU { struct MENU * NextMenu; struct MENU * PrevMenu; void (* InitFunction)(void); }; typedef struct MENU MENU_T; MENU_T MENU_A; // <- this forward declaration is needed for circular reference between structs MENU_T MENU_B; MENU_T MENU_C; MENU_T MENU_A = // <- However redefinition error occurs here { .NextMenu = &MENU_B, .PrevMenu = &MENU_C, .InitFunction = 0, }; MENU_T MENU_B = { .NextMenu = &MENU_C, .PrevMenu = &MENU_A, .InitFunction = 0, }; MENU_T MENU_C = { .NextMenu = &MENU_A, .PrevMenu = &MENU_B, .InitFunction = 0, };,c++,c,struct,C++,C,Struct,就我所知,第一行是声明而不是定义,因此错误重新定义不应该发生 使用菜单T菜单A;,您没有向前声明名为MENU_a的变量,而是定义它。因此,当您稍后编写MENU_T MENU_A={…}时,会出现一个错误,指示您重新定义了一个同名MENU_A的变量 要仅声明变量而不定义它,请使用关键字extern: 使用MENU_T MENU_A;,您没有向前声明名为MENU_a的变量,而是定义它。因此,当您稍后编写MENU_T MENU_A={…}时,会出现一个错误,指示您重新定义了一个同名MENU_A的变量

就我所知,第一行是声明而不是定义,因此错误重新定义不应该发生

使用菜单T菜单A;,您没有向前声明名为MENU_a的变量,而是定义它。因此,当您稍后编写MENU_T MENU_A={…}时,会出现一个错误,指示您重新定义了一个同名MENU_A的变量

要仅声明变量而不定义它,请使用关键字extern:

使用MENU_T MENU_A;,您没有向前声明名为MENU_a的变量,而是定义它。因此,当您稍后编写MENU_T MENU_A={…}时,会出现一个错误,指示您重新定义了一个同名MENU_A的变量

要仅声明变量而不定义它,请使用关键字extern:


C和C++是两种不同的语言,例如,C++中不需要TyPufFraseStutt。请不要使用所有的CAP来代替宏名称和枚举常量。C和C++是两种不同的语言,例如C++中不需要TyPufFr.Stutt。请不要使用所有的CAP来代替宏名称和枚举常量。它令人困惑,难以阅读。
extern MENU_T MENU_A; // declaration of MENU_A, not a definition
extern MENU_T MENU_B;
extern MENU_T MENU_C;

MENU_T MENU_A = 
{
    .NextMenu = &MENU_B,
    .PrevMenu = &MENU_C,
    .InitFunction = 0,
};

...