为什么我的结构定义不完整?

Why my struct has an incomplete definition?

我正在 C:

中实现 struct
typedef struct {
...   
} _p_TSResilOnline;

typedef struct _p_TSResilOnline *TSResilOnline;

之后(在同一个文件中),我正在使用:

TSResilOnline         o  = (TSResilOnline)(chk->data);
...
*check = (o->threshold < PetscAbs(sf)) ? PETSC_FALSE : PETSC_TRUE;

但是我的编译器returns:

error: incomplete definition of type 'struct _p_TSResilOnline'
*check = (o->threshold < PetscAbs(sf)) ? PETSC_FALSE : PETSC_TRUE; ~^ note: forward declaration of 'struct _p_TSResilOnline' typedef struct _p_TSResilOnline *TSResilOnline;

我想知道什么是不完整的。编译器应该无所不知。

在此声明中

struct {
...   
} _p_TSResilOnline;

您定义了一个具有未命名结构类型的标识符 _p_TSResilOnline 的对象。

在此声明中

typedef struct _p_TSResilOnline *TSResilOnline;

您声明了结构类型 struct _p_TSResilOnline

对象的标识符_p_TSResilOnline和typedef声明中用于命名结构的标识符_p_TSResilOnline在不同的命名空间中,标识不同的实体。

struct _p_TSResilOnline 的定义不完整,因为结构的成员未知。

但是在这个表达式中

o->threshold 

您正在尝试访问名称为 threshold 且未声明的成员。

所以编译器报错。

编辑:按照以下方式更改问题中的第一个声明后

typedef struct {
...   
} _p_TSResilOnline;

然而 _p_TSResilOnlinestruct _p_TSResilOnline 是不同的实体,它们的标识符属于不同的名称空间。

你应该改写

struct _p_TSResilOnline {
...   
};

typedef struct _p_TSResilOnline {
...   
} _p_TSResilOnline;