c++ 两个结构的阶

x8diyxa7  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(132)

我有两个结构...

typedef struct{
    MY_SECOND_STRUCT  s1;
}MY_FIRST_STRUCT;

typedef struct{
    int s1;
}MY_SECOND_STRUCT;

我更喜欢这个顺序,我不想切换它们。但是编译器现在不知道MY_SECOND_STRUCT,我得到错误
错误:“MY_SECOND_STRUCT”之前需要指定符限定符列表
我试过在顶部添加声明

struct MY_SECOND_STRUCT;

也将定义更改为

typedef struct{
    struct MY_SECOND_STRUCT  s1;
}MY_FIRST_STRUCT;

但是没有用。

nsc4cvqm

nsc4cvqm1#

我喜欢这个订单,我不想调换。
你得换掉它们。
如果MY_FIRST_STRUCT有一个MY_SECOND_STRUCT类型的成员变量,那么在定义MY_FIRST_STRUCT之前,必须定义并完成MY_SECOND_STRUCT(而不仅仅是声明和不完整)。

ujv3wf0j

ujv3wf0j2#

这个顺序不可能,你得调换一下.
但是,如果将成员声明为指针,则不需要切换:

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_FIRST_STRUCT的时候,只要使用typedef

typedef MY_FIRST_STRUCT_T<MY_SECOND_STRUCT> MY_FIRST_STRUCT;

现在使用MY_FIRST_STRUCT。:-)

bhmjp9jg

bhmjp9jg3#

在你创建第一个结构体的时候,编译器还没有遇到第二个结构体,它需要知道MY_SECOND_STRUCT是多少位,因为那时它需要决定MY_FISRT_STRUCT的大小,以及如何为它布局内存,简单地向前声明结构体MY_FIRST_STRUCT是不够的,这不会告诉编译器结构体的大小或内容。如果使用指向结构体的指针,则可以使用前向声明,但在尝试包含实际结构体时,这是不够的。
你唯一真实的的选择是把MY_SECOND_STRUCT移到MY_FIRST_STRUCT之上或者让MY_FIRST_STRUCT接受一个指针,这可能一开始看起来很奇怪,但是没有什么可以做的。

相关问题