成员访问进入不完整类型错误

Posted

技术标签:

【中文标题】成员访问进入不完整类型错误【英文标题】:Member access into incomplete type error 【发布时间】:2016-11-22 08:17:23 【问题描述】:

我有以下包含封装类型结构定义的文件结构,当我尝试访问该结构的成员时,我收到Member access into incomplete type 错误。问题是什么?

foo_encoder.c

#include "foo.h"
//...
struct FooEncoder 
  int A;
  int B;
  foo_int32 C;
  //...

foo.h:

extern "C" 
  typedef struct FooEncoder FooEncoder;
  //...

foo_interface.h

typedef struct MyFooEncInst FooEncInst;

foo_interface.cc

#include "foo_interface.h"
#include "foo.h"
//...
struct MyFooEncInst 
  FooEncoder* encoder;
;
//...
MyFoo_Encode(FooEncInst* inst,...) 
//...
  if (d > inst->encoder->C)  // This is where I get the error
//...

foo_int32 在其他地方定义。

【问题讨论】:

inlcude foo_encoder.c 到代码中,它将起作用。之后让我知道,并给出完整的答案。另一种方法是在新的 .h 文件中完整定义 struct FooEncoder 并包含它。 您正试图访问MyFooInst* 类型变量的成员。但是,在您提供的代码中没有MyFooInst 类型的定义。 【参考方案1】:

您正在请求FooEncoder 结构中的成员,该成员在您的 foo_interface.cc 文件中的任何位置均不可见。这看起来类似于pimpl idiom。

为了让您的代码了解FooEncoder 的结构,您需要

#include "foo_encoder.c"

在你的 foo_interface.cc 文件中(我很不喜欢这个解决方案,你也没有发布完整的代码)或将你的结构定义移动到头文件中的其他位置并包含那个(推荐)。

【讨论】:

【参考方案2】:

foo.h 正在向仅在 foo.c 中定义的结构声明类型定义,因此 foo_interface.cc 无法了解 FooEncoder 的实际含义。您可以通过将结构定义从 foo_encoder.c 移动到 foo.h 来解决此问题。

【讨论】:

【参考方案3】:

您尝试访问的类型仅在您尝试访问时前向声明。你可以看看这个question to learn what a forward declaration isanswers to this questions解释什么时候可以使用前向声明,什么时候不能。

foo.h 中的 typedef 基本上充当 FooEncoder 类型的前向声明。您将文件包含在 foo_interface.cc 中。所以编译器知道类型存在,但它不知道它的内部结构,比如它有什么成员。因此它不知道是否有像您请求它访问的成员C。 您需要告诉编译器 MyFooEncInstFooEncoder 在内部的样子,以便它能够访问任何成员。

【讨论】:

以上是关于成员访问进入不完整类型错误的主要内容,如果未能解决你的问题,请参考以下文章

指向不完整类型成员函数的指针

c struct queue error:“数组类型具有不完整的元素类型”

C++中啥时候出现不完整类型错误

不完整类型不允许错误

c语言报错不允许使用不完整类型,让用户自定义数组大小。

使用 strcmp 取消引用指向不完整类型错误的指针 [关闭]