我正在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;
我想知道什么是不完整的。编译器应该知道一切。
答案 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_TSResilOnline
和struct _p_TSResilOnline
是不同的实体,它们的标识符属于不同的名称空间。
你应该写
struct _p_TSResilOnline {
...
};
或
typedef struct _p_TSResilOnline {
...
} _p_TSResilOnline;