C++ 两种结构的阶
我有这两个结构C++ 两种结构的阶,c++,c,ansi,C++,C,Ansi,我有这两个结构 typedef struct{ MY_SECOND_STRUCT s1; }MY_FIRST_STRUCT; typedef struct{ int s1; }MY_SECOND_STRUCT; 我更喜欢这道菜,我不想换。 但是编译器现在不知道我的第二个结构,我得到了错误 错误:“MY_SECOND_STRUCT”之前应为说明符限定符列表 我试着在顶部添加声明 struct MY_SECOND_STRUCT; 也将定义更改为 typedef struct
typedef struct{
MY_SECOND_STRUCT s1;
}MY_FIRST_STRUCT;
typedef struct{
int s1;
}MY_SECOND_STRUCT;
我更喜欢这道菜,我不想换。
但是编译器现在不知道我的第二个结构,我得到了错误
错误:“MY_SECOND_STRUCT”之前应为说明符限定符列表
我试着在顶部添加声明
struct MY_SECOND_STRUCT;
也将定义更改为
typedef struct{
struct MY_SECOND_STRUCT s1;
}MY_FIRST_STRUCT;
但这没用
我更喜欢这道菜,我不想换
你得换一下
如果MY_FIRST_STRUCT
具有类型为MY_SECOND_STRUCT
的成员变量,则必须在定义MY_FIRST_STRUCT
之前定义并完成MY_SECOND_STRUCT
我更喜欢这道菜,我不想换
你得换一下
如果
MY_FIRST_STRUCT
具有类型为MY_SECOND_STRUCT
的成员变量,则必须定义并完成MY_SECOND_STRUCT
(而不仅仅是声明和不完整的)在定义MY_FIRST_STRUCT之前在您创建第一个结构时,编译器尚未遇到第二个结构。它需要知道位MY_SECOND\u STRUCT
的大小,因为当时它需要决定制作MY_first\u STRUCT
的大小,以及如何为它布局内存。仅仅向前声明structMY_FIRST_struct
是不够的,这不会告诉编译器结构的大小或内容。如果使用指向结构的指针,则前向声明可以工作,但在尝试包含实际结构时,这是不够的
您唯一的实际选择是将
MY_SECOND_STRUCT
移到MY_FIRST_STRUCT
上方,或使MY_FIRST_STRUCT
接受指针。一开始可能看起来很奇怪,但对此我们无能为力 在您创建第一个结构时,编译器还没有遇到第二个结构。它需要知道位MY_SECOND\u STRUCT
的大小,因为当时它需要决定制作MY_first\u STRUCT
的大小,以及如何为它布局内存。仅仅向前声明structMY_FIRST_struct
是不够的,这不会告诉编译器结构的大小或内容。如果使用指向结构的指针,则前向声明可以工作,但在尝试包含实际结构时,这是不够的
您唯一的实际选择是将
MY_SECOND_STRUCT
移到MY_FIRST_STRUCT
上方,或使MY_FIRST_STRUCT
接受指针。一开始可能看起来很奇怪,但对此我们无能为力 这个顺序是不可能的。你得换一下
但是,如果将成员声明为指针,则不需要切换:
struct MY_SECOND_STRUCT; //forward declaration is required though
typedef struct{
MY_SECOND_STRUCT * s1; //now its a pointer
}MY_FIRST_STRUCT;
<>或者,在C++中,你可以使用模板为:
template<typename MY_SECOND_STRUCT>
struct MY_FIRST_STRUCT_T
{
MY_SECOND_STRUCT s1;
};
struct MY_SECOND_STRUCT
{
int s1;
};
使用
MY\u FIRST\u STRUCT
now.:-) 这个顺序是不可能的。你得换一下
但是,如果将成员声明为指针,则不需要切换:
struct MY_SECOND_STRUCT; //forward declaration is required though
typedef struct{
MY_SECOND_STRUCT * s1; //now its a pointer
}MY_FIRST_STRUCT;
<>或者,在C++中,你可以使用模板为:
template<typename MY_SECOND_STRUCT>
struct MY_FIRST_STRUCT_T
{
MY_SECOND_STRUCT s1;
};
struct MY_SECOND_STRUCT
{
int s1;
};
使用
MY\u FIRST\u STRUCT
now.:-) 这里的其他答案很好。您可能想知道为什么可以向前声明结构,然后声明指向它的指针——编译器知道指针的大小,因此它可以确定包含它的结构的大小,但它不知道第二个结构的大小,因此它不能定义包含它的结构。这里的其他答案很好。您可能想知道为什么可以向前声明结构,然后声明指向它的指针--编译器知道指针的大小,因此它可以确定包含它的结构的大小,但它不知道第二个结构的大小,所以它不能定义一个包含它的结构。如果我将成员声明为指针,并像您编写的那样添加前向声明,我仍然会得到一个错误。我必须写struct我的第二个struct*s1;比它好。(我的编译器gcc)@Meloun:这就是我写的。还是你在用C语言编程?文件扩展名是什么.c
或.cpp
?如果我将成员声明为指针,并像您编写的那样添加前向声明,我仍然会得到一个错误。我必须写struct我的第二个struct*s1;比它好。(我的编译器gcc)@Meloun:这就是我写的。还是你在用C语言编程?文件扩展名是什么.c
或.cpp
?