【问题标题】:what files need to be include in header files? structs? <stdbool.h>?头文件中需要包含哪些文件?结构? <stdbool.h>?
【发布时间】:2011-01-15 11:27:10
【问题描述】:

假设我像这样在“struct.h”中定义一个结构

struct box {
    int value; 
}

我在另一个文件中使用该结构说“math.c”

#include "struct.h"

struct box *sum(struct box *a1, struct box *a2) {
    struct box *a3 = malloc(sizeof (struct box));
    a3->value = a1->value + a2->value;
    return a3;
}

“math.h”是否也需要包含“struct.h”?

#include "struct.h"

struct box *sum(struct box *a1, struct box *a2);

如果 struct box 被替换为 bool,我需要在头文件和 c 文件中包含 stdbool.h 吗?似乎编译器想要这个。

什么时候应该在标头而不是 .c 中包含文件?也想知道我的例子是否有什么不寻常的地方。

谢谢!

【问题讨论】:

    标签: c


    【解决方案1】:

    如果头文件的内容使用此类包含定义的类型,则在头文件中包含其他包含。 (对不起,那是一口。)

    在您的情况下,math.h 绝对应该包含struct.h,不过,我认为这两者都不是用户定义的头文件的好名称(前者因为已经有系统提供的math.h;后者是因为struct 是关键字)。 :-P

    如果你的头文件使用bool,那么是的,它应该包含stdbool.h

    【讨论】:

      【解决方案2】:

      一般规则是在头文件中包含尽可能少的内容。

      尽可能使用前向声明而不是定义,然后您可以将定义移至 .c 文件。这可以减少您需要包含在头文件中的文件数量。

      在您的具体示例中,您可以从 math.h 中删除 struct.h 的包含并改为转发声明框。并不是说它在这种特定情况下有很大的不同。

      【讨论】:

      • 我将如何进行 bool 的前向声明?
      • @overcyn:你不能:它是宏而不是类型。您不能转发声明宏。
      • C99 有一个名为 _Bool 的内置类型。 stdbool.h 只是 typedefbool#definetruefalse
      【解决方案3】:

      “math.h”是否需要包含 “struct.h”也是?

      不,因为在 math.h(不是一个好名字,顺便说一句)中,您只处理指向类型的指针。只有在处理类型的实例时才需要定义。但是,最好将其包含在内,因为 将与实际实例进行通信的用户将不得不自己单独包含它。

      【讨论】:

      • 因为最后一句话而上升。当您应该使用的唯一标头是声明它的标头时,必须跟踪某个函数所需的所有标头,这是一件令人头疼的事情。
      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多