2011-08-08 71 views
1

我有这两种结构的...为了两个结构

typedef struct{ 
    MY_SECOND_STRUCT s1; 
}MY_FIRST_STRUCT; 


typedef struct{ 
    int s1; 
}MY_SECOND_STRUCT; 

我喜欢这个顺序,我不希望他们进行切换。 但是编译器不知道此刻MY_SECOND_STRUCT,我得到错误

error: expected specifier-qualifier-list before 'MY_SECOND_STRUCT'

从来就试图定义添加声明顶端

struct MY_SECOND_STRUCT; 

也改为

typedef struct{ 
    struct MY_SECOND_STRUCT s1; 
}MY_FIRST_STRUCT; 

但它没有帮帮我。

+1

这里的其他答案很好。您可能想知道为什么您可以转发声明结构,然后声明一个指针 - 编译器知道指针的大小,因此它可以确定包含它的结构的大小,但它不知道大小第二个结构,所以它不能定义一个包含它的结构。 –

回答

3

该订单是不可能的。你必须切换它们。

但是,如果你声明成员为指针,然后切换不要求:

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; 

使用现在。 :-)

+0

如果我将成员声明为指针,并在写入时添加前向声明,则仍然会出现错误。我必须写 ** struct MY_SECOND_STRUCT * s1; ** 比它好。 (我的编译器gcc) – Meloun

+0

@Meloun:这是我写的。或者你在C编程?什么是文件扩展名? '.c'或'.cpp'? – Nawaz

8

I prefer this order, I dont want to switch them.

您必须切换它们。

如果MY_FIRST_STRUCT具有MY_SECOND_STRUCT类型的成员变量然后MY_SECOND_STRUCT必须定义和MY_FIRST_STRUCT定义之前完整(不只是声明和不完全)。

1

当你cerate你的第一个结构时,编译器还没有遇到第二个结构。它需要知道位MY_SECOND_STRUCT是怎么回事,因为那时它需要决定制作MY_FISRT_STRUCT有多大,以及如何为它配置内存。简单地说,声明struct MY_FIRST_STRUCT是不够的,它不会告诉编译器关于结构的大小或内容。如果您正在使用指向结构的指针,则前向声明将会起作用,但在尝试包含实际结构时,它是不够的。

您唯一的实际选择是移动MY_SECOND_STRUCT以上MY_FIRST_STRUCT或使MY_FIRST_STRUCT需要一个指针。起初可能看起来很奇怪,但对此没有太多可以做的。