【问题标题】:Why my struct has an incomplete definition?为什么我的结构定义不完整?
【发布时间】:2025-12-21 22:55:10
【问题描述】:

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

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

【问题讨论】:

  • 因为您使用的是typedef 中的结构实例,而不是结构的类型。试试struct _p_TSResilOnline { ...};
  • struct { ... } _p_TSResilOnline 定义了一个未命名(未标记)结构类型的变量。在结构定义中添加标签。
  • 不要typedef指针!这最终会导致混乱和缺陷。
  • 对。所以它适用于:struct _p_TSResilOnline{ ... } ; typedef struct _p_TSResilOnline *TSResilOnline;
  • 注意:即使您修复了错误,代码仍可能违反严格别名规则,导致未定义行为

标签: c pointers struct declaration


【解决方案1】:

在此声明中

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

你应该改写

struct _p_TSResilOnline {
...   
};

typedef struct _p_TSResilOnline {
...   
} _p_TSResilOnline;

【讨论】:

    最近更新 更多