假设我们在源文件中有两个结构:
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
(因为比较函数的参数不能改变 - 它是递归函数),但是我想看看是否有其他解决方案,为什么会发生这种情况。
注意:结构定义已写入源文件以加密其内部结构。
答案 0 :(得分:1)
你正在做的事情肯定没有“加密”,但它使你的示例代码无法看到这些结构的实现。如果要访问结构中的字段,则需要使完整的结构定义对该转换单元可见。否则,它是一个不完整的类型,就像错误消息所说的那样。
答案 1 :(得分:1)
您尝试使用typedef为struct A
和struct B
声明不透明的数据类型,但同时您尝试使用这种opaque类型访问字段。< / p>
您只能执行上述操作之一,而不能同时执行。
解决方案是公开完整的结构定义或提供帮助访问特定字段的帮助方法。辅助方法的实现将再次需要访问完整的结构定义。