![](/img/trans.png)
[英]Struct forward declaration error: Typedef redefinition with different types
[英]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.