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

use*_*692 6 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];
};
Run Code Online (Sandbox Code Playgroud)

在我的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...
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为单位是在数据之后声明的 project_typedef.h(如果我切换它的工作顺序).我得到的错误是"左'.x'必须有struct/union类型".我认为前方声明会解决这个问题.为什么不?

Ker*_* SB 11

当你定义 Data,所有成员都必须是完整的类型.由于此时UNITS不是完整类型,因此不起作用.(相比之下,UNITS_PTR 被罚款,因为指向不完全类型是完全类型.)

简单地将Units定义放在定义之上Data,你应该没问题.

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


K-b*_*llo 6

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