【问题标题】:should structure definition (not instantiation) be placed in header file?结构定义(不是实例化)应该放在头文件中吗?
【发布时间】:2011-07-14 06:37:35
【问题描述】:

我有一个 .c 文件和一个 .h。

我不打算拥有多个 .c 文件。

我应该将结构定义放在头文件中吗?

最佳做法是什么?

.h
typedef struct cow_s {
    int legs;
    char eyes;
} cow_t;

.c
cow_t *ptr_to_cow;

注意:我不希望 struct 成为全球性的。

【问题讨论】:

  • 您确定以后不会有多个.c 文件吗?

标签: c struct typedef header-files


【解决方案1】:

如果您不打算将此结构暴露给其他模块(并且您说您只有一个模块),则没有真正的理由将其放在头文件中,除非保持有序。

【讨论】:

  • 非常感谢。我确实想让事情井井有条,所以会把它放在 .h 中。我还有另一个问题/疑问要澄清:如果我在 .h 中实例化该结构,它就会变成全局的,对吗?如果我在 .c 中这样做(就像我正在做的那样)它不会是全球性的。我的假设正确吗?
  • @hari:如果您在 .h 中实例化它,那么它的副本会在包含该文件的每个翻译单元(h 文件 + c 文件代码)中创建,如果您在.c 文件在任何函数之外,然后它成为该特定文件的全局文件,其他文件仍然可以使用 extern 关键字访问它。
  • @Als:谢谢。我不想让它成为全局的,所以我将在一个函数中实例化并通过指向它的指针传递它。
【解决方案2】:

结构定义属于 .h 文件(通常)。如果要隐藏结构,请将其放入将使用它的 .c 文件中。

【讨论】:

    【解决方案3】:

    这取决于您打算如何让您的用户使用该结构。如果允许他们实例化和修改成员,那么您需要将定义放在头文件中。另一方面,如果用户不需要访问结构成员,则应将其放在 .c 文件中。

    假设是后一种情况。如果是这样,cow_t 对用户来说是不透明的,您需要为其创建访问器函数。例如:

    cow_t *CreateCow( void )
    {
      return malloc( cow_t );
    }
    
    void SacrificeCow( cow_t *cow )
    {
      free( cow );
    }
    
    int GetNumberOfCowLegs( cow_t *cow )
    {
      return cow->legs;
    }
    
    void SetNumberOfCowLegs( cow_t *cow, int numLegs )
    {
      cow->legs = numLegs;
    }
    

    【讨论】:

    • 我的想法是:它在 main() 中实例化并通过引用传递给其他函数。这样其他功能可以对其进行更改。没关系,对吧?
    • @hari:你的意思是通过指针传递给其他函数; C 没有通过引用传递。这些其他功能是否在同一个 .c 文件中?如果没有,您必须将结构放在头文件中,并让所有需要使用它的 .c 文件包含该头文件。
    • 我的错;是的,将指针传递给结构。为清楚起见,只有 1 个 .c 文件我将 struct 放在标题中。
    • @hari:如果只有 1 个 .c 文件,则不需要标头,只需将要放入标头中的所有内容放在此 .c 文件的顶部即可。跨度>
    • 我认为有一个标题总是更干净的方法?不?此外,在我死后,其他一些开发人员决定添加另一个 .c,有一个标题会有所帮助:D
    猜你喜欢
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多