在C中声明结构的定义应该在哪里? .c或.h?

时间:2017-12-03 03:27:22

标签: c struct typedef

在C中实现ADT时,我一直认为struct的定义应该在.c文件中,以便它是私有的。并且typedef应放在.h文件中,以便其他模块可以使用ADT,但无法直接修改其属性。 我最近遇到了一个问题,我不得不将结构移动到.h。我还找到了答案Error: In C, got the error "dereferencing pointer to incomplete type" in a struct pointer,据说struct应该在.c文件中定义。这是真的?如果是,那是什么原因?

1 个答案:

答案 0 :(得分:2)

正如我在comment中所说:

ADT的结构定义通常应位于定义支持函数的源(.c)文件中,并且标题(.h)文件中只应存在该类型的声明。

但是,这意味着您无法在定义ADT的源文件之外分配结构的实例。您只能在外面定义指向ADT的指针。

如果必须将定义从源移动到头,这意味着某些东西没有使用应该使用指针的指针。返回并修复损坏的代码,并将结构定义移回ADT的源文件中。

并且,确认Nevado中的comment注释,这也意味着您不能拥有ADT数组;您可以拥有指向ADT的指针数组,但不能拥有ADT本身的数组。

请注意,如果您希望或需要这样做,那么公开结构是完全合法的。然后,您可以创建数据类型的变量或它们的数组,或者在其他结构中嵌入类型(而不是指向该类型的指针)等。您将失去一些控制权;编写使用该结构的代码的程序员可以查看详细信息,并可以直接访问(读取或修改)结构元素。谨慎的程序员不必要地做到了这一点,但它开辟了严格的ADT习语所排除的可能性 - 冒着犯错误的风险。