在C中使用前向声明的typedef stuct

我有类似的东西:

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]; }; 

在我的project_typedef.h文件中。

在另一个文件中,我有类似的东西:

 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类型”。 我认为前方声明会解决这个问题。 为什么不?

定义 Data ,所有成员必须是完整类型。 由于UNITS在那时不是一个完整的类型,这不起作用。 (相比之下, UNITS_PTR 很好,因为指向不完整类型的指针是完整的类型。)

只需将Units定义置于Data定义之上,就可以了。

(正如@cnicutar已经注意到的那样,你也使用了数组x错了。)

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

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

对于结构定义,您应该始终对结构中的所有成员使用完整类型…但是struct Data UNITS units不是这种情况,它声明了一个名为units类型struct Units的变量,它在struct Data之前永远不会被声明…这反映了一个错误..您应该将Units定义放在Data定义之上..并且一切都会正常工作..

因为无论何时定义结构变量,编译器首先分配结构所需的内存( 结构成员不必分配给它们的内存,除非它们链接到结构类型的变量 ..为什么struct变量不能在struct template中初始化).. 🙂