在C中使用前向声明的typedef结构

时间:2011-11-16 18:02:26

标签: c struct typedef forward-declaration

我有类似的东西:

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

4 个答案:

答案 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中初始化的地方).. :))