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

时间:2017-08-15 19:58:23

标签: c++ c struct

以下代码在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,
};

据我所知,第一行是声明而不是定义,所以&#34;错误重新定义&#34;不应该发生...

1 个答案:

答案 0 :(得分:4)

使用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,
};

...