循环依赖结构,使用前向声明时结构的错误重定义

Circular dependency struct, error redefinition of struct when using forward declaration

本文关键字:结构 错误 定义 声明 依赖 循环      更新时间:2023-10-16

以下代码在 C 语言中编译,在 Keil 下使用 ARMCC 编译,但在 C++ 中无法编译,在 eclipse 下使用 G++。原始代码有一些 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,
};

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

使用MENU_T MENU_A;时,您不会"正向声明"一个名为MENU_A的变量,而是定义它。因此,当您稍后编写MENU_T MENU_A = { ... }时,您会收到一个错误,指示您重新定义了具有相同名称的变量MENU_A

对于仅声明变量(不定义它(,请使用关键字extern

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