我正在用 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;
我想知道什么是不完整的。编译器应该无所不知。
最佳答案
在这个声明中
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_TSResilOnline
和 struct _p_TSResilOnline
是不同的实体,它们的标识符属于不同的 namespace 。
你应该改写
struct _p_TSResilOnline {
...
};
或
typedef struct _p_TSResilOnline {
...
} _p_TSResilOnline;
关于c - 为什么我的结构定义不完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35733007/