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
的大小,以及如何为它布局内存。仅仅向前声明struct
MY_FIRST_struct
是不够的,这不会告诉编译器结构的大小或内容。如果使用指向结构的指针,则前向声明可以工作,但在尝试包含实际结构时,这是不够的


您唯一的实际选择是将
MY_SECOND_STRUCT
移到
MY_FIRST_STRUCT
上方,或使
MY_FIRST_STRUCT
接受指针。一开始可能看起来很奇怪,但对此我们无能为力

在您创建第一个结构时,编译器还没有遇到第二个结构。它需要知道位
MY_SECOND\u STRUCT
的大小,因为当时它需要决定制作
MY_first\u STRUCT
的大小,以及如何为它布局内存。仅仅向前声明struct
MY_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