循环依赖结构,使用前向声明时结构的错误重定义
Circular dependency struct, error redefinition of struct when using forward declaration
以下代码在 C 语言中编译,在 Keil 下使用 ARMCC 编译,但在 C++ 中无法编译,在 eclipse 下使用 G++。原始代码有一些 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,
};
...
相关文章:
- C++ 结构错误"调用'erase'没有匹配函数
- 尝试传递结构数组,但出现"无法将'结构'转换为'结构*'错误
- 结构错误:"no matching function for call to "
- UE4 数据表结构错误
- STL 对priority_queue<int、结构>错误
- C :用于体系结构错误的经典未定义符号
- 体系结构错误的未定义符号
- 奇怪的用户定义的比较结构错误,用于C++中的priority_queue
- 模板结构错误
- C++结构错误 - 错误 C2061:语法错误:标识符
- C++ 结构错误的前向声明
- 结构错误"uninitialized reference member"
- 使用 MPL::fold 与占位符和我自己的结构错误
- C++结构错误"No matching function for call..."
- 插入映射<字符串,结构>错误
- CPP 头文件结构错误
- 矢量和结构错误
- C++ 结构 - 错误 1 错误 C2143:语法错误:缺少'*'之前的';'
- 结构错误的构造函数(调用类的构造函数 denconstructor,用于填充结构)
- 结构错误与C++