0

假设我们在一个源文件中有两个结构:

struct B {
    int x;
};

struct A {
    beta y;
}; 

在等效的头文件中,我们有这些:

typedef B* beta;
typedef A* alpha;

此外,这些函数原型在头文件中定义:

printAplha(alpha);
compare(const beta, const beta);

在主文件中,我包含了特定的头文件,代码如下所示:

alpha one, two;
printAlpha(one);
printAlpha(two);
//everything works fine up to here
compare(one->y, two->y);

在我得到的代码的最后一行

main.c:37:20:错误:取消引用指向不完整类型的指针
main.c:37:33:错误:取消引用指向不完整类型的指针

我知道我可以使用包装函数compare,其参数将是类型alpha(因为比较函数的参数不能更改 - 它是递归的),但我想看看是否有任何其他解决方案,并且为什么会这样。

注意:结构定义已写入源文件以创建不透明数据类型。

4

2 回答 2

1

您正在做的事情肯定没有“加密”,但这使您的示例代码无法看到这些结构的实现。如果要访问结构中的字段,则需要使完整的结构定义对该翻译单元可见。否则,它是一个不完整的类型,就像错误消息所说的那样。

于 2013-03-22T01:36:51.693 回答
1

您正在尝试为 typedef 声明struct Astruct B使用不透明数据类型,但同时您正在尝试使用这种不透明类型访问字段。

您只能执行上述一项,不能同时执行两项。

解决方案是公开完整的结构定义或提供有助于访问特定字段的辅助方法。辅助方法的实现将再次需要访问完整的结构定义。

于 2013-03-22T01:58:51.040 回答