我还是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
bool
用于函数参数,因此我也在源代码中使用它。我是否必须在头文件和源文件中#include <stdbool.h>
?是否存在我愿意和不在哪里的情况?
如果我在标题中使用的另一个头文件中有一个typedef作为函数参数怎么办?我是否必须在头文件和源文件中#include "DataStruct.h"
?
标准是什么?
答案 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
。