我有类似的东西:
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类型”。我认为前方声明会解决这个问题。为什么不呢?
答案 0 :(得分:11)
当您定义 Data
时,所有成员必须是完整类型。由于此时UNITS
不是完整类型,因此无效。 (相比之下,UNITS_PTR
会没问题,因为指向不完整类型的指针是完整类型。)
只需将Units
定义放在Data
定义之上,就可以了。
(正如@cnicutar已经注意到的那样,你也使用了数组x
错误。)
答案 1 :(得分:6)
前向声明允许您在允许不完整类型的上下文中使用其名称。声明结构成员不是这种情况之一,必须知道完整的定义,因为它有助于结构布局。
答案 2 :(得分:1)
没有struct的原型。这是因为编译器在使用之前需要知道struct的大小。你可以在struct上使用指针,因为无论指针指向哪种类型,指针都有已知的大小。
答案 3 :(得分:1)
对于结构定义,您应该始终对结构中的所有成员使用完整类型...但UNITS units
中的struct Data
不是这种情况,它声明了一个名为{{1}的变量类型为units
的类型,它永远不会在结构数据之前声明...这反映了一个错误..你应该将struct Units
定义置于Units
定义之上..并且一切都会正常工作。 。
并且关于前向声明这不起作用,因为每当定义一个struct变量时,编译器首先分配struct所需的内存( struct members donot有一个分配给它们的内存,除非它们链接到struct变量类型 ..这就是为什么struct变量不能在struct template中初始化的地方).. :))