【问题标题】:Dereferencing a pointer to incomplete type取消引用指向不完整类型的指针
【发布时间】:2013-03-11 18:32:22
【问题描述】:

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

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(因为比较函数的参数不能更改 - 它是递归的),但我想看看有没有其他解决办法,为什么会这样。

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

【问题讨论】:

  • 为什么我的问题被否决了?有人可以提供一个理由以便知道我做错了什么吗?

标签: c pointers struct


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 Tuxdude,你得到了我想要做的事情!我将创建辅助方法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多