在 C 中应该在哪里声明结构的定义? .c 还是 .h?
Where should be the definition of a struct be declared in C? .c or .h?
在用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
文件中定义。这是真的?如果是,原因是什么?
正如我在 comment 中指出的那样:
ADT 的结构定义通常应该在定义支持函数的源 (.c
) 文件中,header (.h
) 文件.
但是,这意味着您不能在定义 ADT 的源文件之外分配结构的实例。只能在外部定义指向ADT的指针。
如果您必须将定义从源代码移动到 header,这意味着某些东西没有使用应该使用指针的指针。返回并修复损坏的代码,并将结构定义移回 ADT 的源文件中。
而且,确认什么Nevado notes in a comment,这也意味着你不能有一个ADT数组;您可以拥有指向 ADT 的指针数组,但不能拥有 ADT 本身的数组。
请注意,如果您希望或需要这样做,那么公开结构是完全合法的。然后允许您创建数据类型的变量或它们的数组,或者将类型(而不是指向该类型的指针)嵌入其他结构等。您失去了一些控制;编写使用该结构的代码的程序员可以查看详细信息并可以直接访问(读取或修改)结构元素。谨慎的程序员不会不必要地这样做,但它打开了被严格的 ADT 惯用语排除的可能性——冒着犯错误的风险。
在用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
文件中定义。这是真的?如果是,原因是什么?
正如我在 comment 中指出的那样:
ADT 的结构定义通常应该在定义支持函数的源 (.c
) 文件中,header (.h
) 文件.
但是,这意味着您不能在定义 ADT 的源文件之外分配结构的实例。只能在外部定义指向ADT的指针。
如果您必须将定义从源代码移动到 header,这意味着某些东西没有使用应该使用指针的指针。返回并修复损坏的代码,并将结构定义移回 ADT 的源文件中。
而且,确认什么Nevado notes in a comment,这也意味着你不能有一个ADT数组;您可以拥有指向 ADT 的指针数组,但不能拥有 ADT 本身的数组。
请注意,如果您希望或需要这样做,那么公开结构是完全合法的。然后允许您创建数据类型的变量或它们的数组,或者将类型(而不是指向该类型的指针)嵌入其他结构等。您失去了一些控制;编写使用该结构的代码的程序员可以查看详细信息并可以直接访问(读取或修改)结构元素。谨慎的程序员不会不必要地这样做,但它打开了被严格的 ADT 惯用语排除的可能性——冒着犯错误的风险。