【问题标题】:complete an incomplete type for a wrapper in C在 C 中完成包装器的不完整类型
【发布时间】:2020-12-03 15:57:36
【问题描述】:

我在一天中的大部分时间都被困在这个问题上。 我的目标是链接两个库。我只能接触到 wrapper.c/.h 和 DepB.h 文件。 我正在尝试使用由库 B 结构 (structB) 持有的结构 (structA) 之一来获取库 A。 我知道我可以将 structA 作为 void* 存储在 structB 中,然后对其进行转换,但我想获得更性感的代码!

实际上,gcc 会为我返回 wrap() 的以下错误:

void wrap (structB* structBptr)
{
  structA structAinst;
  structBptr->structAptr = &structAinst;
  //  warning: assignment from incompatible pointer type
  
  funcA(structBptr->structAptr->someField);
  //  error: dereferencing pointer to incomplete type 'struct structA'
}

我想知道这个问题是否来自将 structA 定义为类型的 DepA.h... 我可以在我的包装器或 LibB 依赖项中写什么,他将 DepA.h 定义为 structA?

【问题讨论】:

  • 您需要在您的wrapper.c 文件或wrapper.h 中包含DepB.h
  • 哎呀我忘了把它放在我的计划中,它包含在我的实际项目中!我更新了图片!
  • 您在任何地方都没有struct structA。在structA 的声明中需要一个结构标记。
  • DepA.h中有一个typedef:typedef struct {...} structA;
  • struct structAstructA 不同。

标签: c wrapper typedef


【解决方案1】:

一个解决方案是创建一个包装器类型:

使用此解决方案,库 B 中的 structA 仍然未知。

【讨论】:

  • 如果你想对 LibB 透明,你可以在 struct 声明中使用 void* 并且只转换为 wrapper.c 中函数内的真实类型
  • 我想要透明,但强制包装器调用的层用正确的类型初始化 libB。如果设置了错误类型的指针,则强制转换将删除警告。此解决方案中是否有您不喜欢的地方?
猜你喜欢
  • 1970-01-01
  • 2013-09-15
  • 2016-10-06
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多