2017-08-15 19 views
1

次のコードは、Keilの下でARMCCを使用してCでコンパイルしますが、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;

+2

CおよびC++は、2つの異なる言語ですが、たとえば、あなたは 'C++でのtypedef struct'は必要ありません。 –

+1

マクロ名と列挙定数以外のものには、すべて大文字を使用しないでください。それは混乱して読みにくいです。 –

答えて

4

で、あなたは「前方宣言しません"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, 
}; 

... 
+0

はい。これは間違いなく正解です。 –