簡體   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