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

标签 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;

但是我的编译器返回:

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 是不同的实体,它们的标识符属于不同的 namespace 。

你应该改写

struct _p_TSResilOnline {
...   
};

typedef struct _p_TSResilOnline {
...   
} _p_TSResilOnline;

关于c - 为什么我的结构定义不完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35733007/

相关文章:

c - 在线程中使用时,recvfrom() 对于 RAW 套接字返回 -1?

objective-c - 为什么 NSInvocation getReturnValue : lose object?

C结构指向结构数组的指针,来自结构

ios - Swift:在协议(protocol)中使用未定义的函数?

c - 为什么这个C程序在Windows中给出o/p而不是在Linux中给出o/p?

c - 如何编写用指针扫描字符串字符串的程序

c - 数组名是C语言中的指针吗?

在 C 中复制一个带有字符串成员的结构

代码在控制台上没有输出

c - 初始化并访问指针数组中的指针