![](/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.