【问题标题】:Where should be the definition of a struct be declared in C? .c or .h?在 C 中应该在哪里声明结构的定义? .c 还是 .h?
【发布时间】:2017-12-03 03:27:21
【问题描述】:

在 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 文件中定义。这是真的?如果是,是什么原因?

【问题讨论】:

  • 您的问题到底是什么?如果需要多个 .c 文件中的结构定义,则应将其放在标头中,否则不必。
  • @M.M 只需要在一个 .c 文件中。我的问题是,是否有一个选项被认为是一种好的做法,而不是另一个,如果是这样的话,为什么。
  • 这真的是见仁见智。一般来说,如果不需要在其他地方使用某些内容,最好不要将其放在标题中
  • ADT 的结构定义通常应该在定义支持函数的源文件 (.c) 中,并且头文件 (.h) 中应该只存在类型声明.但是,这意味着您不能在定义 ADT 的源文件之外分配结构的实例。您只能在外部定义指向 ADT 的指针。如果您必须将定义从源代码移动到标题,这意味着某些东西没有使用应该使用指针的指针。返回并修复损坏的代码,并将结构定义移回 ADT 的源文件中。
  • 好的,非常感谢。我发现了我的错误,我试图分配和排列到 ADT,然后使用像 myADT[3] 这样的索引来访问它。我改为指针数组,现在一切都很好!

标签: c struct typedef


【解决方案1】:

正如我在comment 中指出的:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2016-05-05
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多