在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中初始化).. 🙂