2016-03-01 211 views
-1

我用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; 

但我的编译器回报:

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;

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

+0

因为你使用结构的实例在'typedef',该结构的不类型。尝试'struct _p_TSResilOnline {...};' –

+2

'struct {...} _p_TSResilOnline'定义了一个未命名(无标记)结构类型的变量。给结构定义添加一个标签。 –

+2

不要'typedef'指针!这最终会导致混乱和缺陷。 – Olaf

回答

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; 
+0

感谢您的明确解释:) –

+0

@ pl-94完全没有。 –

相关问题