我有以下文件结构,其中包含结构的定义和封装类型,当我尝试访问结构的成员时,我收到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
在另一个地方定义。
答案 0 :(得分:3)
foo.h声明了一个只在foo.c中定义的结构的类型定义,因此foo_interface.cc无法看到FooEncoder实际上是什么。您可以通过将结构定义从foo_encoder.c移动到foo.h来解决此问题。
答案 1 :(得分:3)
您要求FooEncoder
结构中的成员在 foo_interface.cc 文件中的任何位置都不可见。这类似于pimpl idiom。
为了让您的代码了解FooEncoder
的结构,您需要
#include "foo_encoder.c"
foo_interface.cc 文件中的(我完全不喜欢这个解决方案,你也没有发布完整的代码)或者将你的结构定义移到头文件的其他地方并包含那个(推荐)。
答案 2 :(得分:0)
您尝试访问的类型仅在您尝试访问时正向声明。您可以查看此question to learn what a forward declaration is,同时answers to this questions解释何时可以使用前向声明,何时不能使用。
foo.h 中的typedef基本上充当类型FooEncoder
的前向声明。您将文件包含在 foo_interface.cc 中。所以编译器知道类型存在但是它对内部结构一无所知,比如它有什么成员。因此,它不知道是否有像您要求它访问的成员C
。
您需要告诉编译器内部MyFooEncInst
和FooEncoder
的内容,以便能够访问任何成员。