在头文件和源文件中包含<stdbool.h>?</stdbool.h>

时间:2014-02-03 04:57:11

标签: c header include

我还是C的新手。我对源文件和头文件有疑问。我有一个像这样的头文件:

#ifndef MISC_H_
#define MISC_H_
#define BYTE 8

#include <stdbool.h>
#include <stdio.h>
#include "DataStruct.h"

bool S_areEqual(char *firstString, char *secondString); /* (1) */
bool S_randomDataStructureCheck(char *string, DataStruct *data); /* (2) */

#endif
  1. bool用于函数参数,因此我也在源代码中使用它。我是否必须在头文件和源文件中#include <stdbool.h>?是否存在我愿意和不在哪里的情况?

  2. 如果我在标题中使用的另一个头文件中有一个typedef作为函数参数怎么办?我是否必须在头文件和源文件中#include "DataStruct.h"

  3. 标准是什么?

2 个答案:

答案 0 :(得分:3)

不,您不必同时包含标头和源(.c)文件。如果您已包含在源包含的标头中,那么它也可供源使用。当某些标头依赖于其他标头时,标头包含的顺序可能很重要。有关详细信息,请参阅this answer

顺便说一句,你会注意到这些行

#ifndef MISC_H_
#define MISC_H_

确保标题仅包含一次。

<强>更新

来自评论:

  
    

所以在源代码中,您只需包含其各自的标题?

  

如果您的意思是,如果源文件包含其各自的标头,那么它取决于。通常,文件应包含他们需要的文件。

如果源文件需要标头,但是它自己的头文件不需要该标头,则include应该在源而不是其标头中。一个原因是概念上更清晰,每个文件只包含它需要的文件,因此很容易分辨出依赖关系是什么。另一个原因是它减少了变化的影响。

让我们看一个例子。假设您有foo.c和foo.h并且foo.c需要foodep.h来编译,但是foo.h没有:

选项1:foo.h

#include“foodep.h”

现在假设有许多其他文件foo1.h,foo2.h,foo3.h等包含foo.h.然后,对foodep.h的任何更改都会影响所有其他文件及其相关的头文件和源文件。

选项2:foo.c

#include“foodep.h”

现在,没有其他文件可以看到foodep.h。对foodep.h的更改只会影响foo.c.

通常,尝试应用与面向对象编程相同的实践 - 封装并最小化更改范围。

答案 1 :(得分:0)

查看这个的简单方法是你应该总是包含提供你在程序中使用的函数/别名/宏的头文件,是否需要将它们包括在内,应该留给编译器。

这是因为每个头文件都是在#ifdef - #endif子句下定义的,条件是某些特定于头的MACRO(如果你定义自己的头,有必要这样做,以避免多个包含,从而避免痛苦的编译器错误)

因此,我的建议是,如果您在程序中使用bool,则应包含stdbool.h。如果编译器已将其包含在某些其他标头的定义中,则它将不再包含stdbool