繁体   English   中英

循环依赖结构,使用前向声明时对结构进行错误重新定义

[英]Circular dependency struct, error redefinition of struct when using forward declaration

以下代码在Keil下使用ARMCC在C中进行编译,但是在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,
};

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

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

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM