2011-11-16 78 views
5

我有这样的:在我project_typedef.h文件的typedef与向前声明stuct用C

typedef struct Data DATA, *DATA_PTR; 
typedef struct Units UNITS, *UNITS_PTR; 

struct Data 
{ 
    double miscData; 
    UNITS units; 
}; 

struct Units 
{ 
    double x[2]; 
    double y[2]; 
    double z[2]; 
}; 

在另一个文件中,我有这样的:

void fileInput(DATA_PTR data) 
{ 
    //usual declarations and other things 
    data->miscData = 0; //Works! 
    data->units.x[0] = 5; //Doesn't work 
    //etc... 
} 

但是,这并不工作,因为单位在project_typedef.h数据宣布后(如果切换它的工作顺序)。我得到的错误是“.x'的左边必须有struct/union类型”。我认为前面的声明可以解决这个问题。为什么不?

+3

首先,==看起来很奇怪...... – Tudor

+0

@Tudor,一个错字,但这不是它在我的代码中。现在编辑出来。 – user1007692

+3

我只是想告诉我,当我看到用作普通类型的指针类型时,我讨厌。 DATA_PTR不会以任何方式简化写代码,因为它仍然是指针,并且您仍然必须使用 - >运算符。 –

回答

10

当你定义Data,所有成员必须是完整的类型。由于UNITS在这一点上不是一个完整的类型,这是行不通的。 (相比之下,UNITS_PTR是很好的,因为指向不完全类型是完全类型。)

简而言之上述Data定义Units定义,你应该罚款。

(如@cnicutar已经指出的那样,你还使用数组x错误。)

5

前向声明允许您在允许不完整类型的上下文中使用它的名称。声明一个结构体成员不是这种情况之一,完整的定义必须是已知的,因为它有助于结构体布局。

1

没有原型结构。这是因为编译器在使用它之前需要知道struct的大小。你可以在struct上使用指针,因为无论指向哪种类型的指针都具有已知的大小。

0

你应该总是使用完整的类型结构中的所有成员结构的定义......但这不是与UNITS unitsstruct Data,其中声明了一个名为struct Unitsunits这是从来没有的结构之前声明的变量的情况下数据......这反映了一个错误..你应该把Units定义上述Data定义..一切都将正常工作..

和关于提前声明,这并不工作,因为当一个结构体变量的定义,编译器首先分配结构所需的内存(结构成员不分配给他们的内存,除非他们ar e链接到一个结构类型的变量 ..那就是为什么结构变量不能初始化结构模板内).. :)