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

时间:2016-03-01 20:38:40

标签: c pointers struct declaration

我正在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;

但是我的编译器返回:

  

错误:类型'struct _p_TSResilOnline'的定义不完整。
  * check =(o-&gt; threshold&lt; PetscAbs(sf))? PETSC_FALSE:PETSC_TRUE;               〜^   注意:'struct _p_TSResilOnline'typedef struct的前向声明   _p_TSResilOnline * TSResilOnline;

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

1 个答案:

答案 0 :(得分:2)

在此声明中

struct {
...   
} _p_TSResilOnline;

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

在此声明中

typedef struct _p_TSResilOnline *TSResilOnline;

您声明了结构类型struct _p_TSResilOnline

用于在typedef声明中命名结构的对象和标识符_p_TSResilOnline的标识符_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;