我仍然是新的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) */
#endifbool,因此,我在源中也使用了它。我必须同时在头文件和源文件中进行#include <stdbool.h>吗?在哪些情况下我愿意,哪些地方我不愿意?#include "DataStruct.h"吗?标准是什么?
发布于 2014-02-03 05:03:25
不,您不必同时包含在头文件和源文件(.c)中。如果您已经包含在源包含的标题中,那么它也将对源可用。当某些标头依赖于其他标头时,包含头的顺序可能很重要。有关更多细节,请参见this answer。
作为旁白,你会注意到台词
#ifndef MISC_H_
#define MISC_H_这确保头只包含一次。
更新
从评论中:
那么在源中,您只包含了它各自的头吗?
如果您的意思是,源文件应该只包含其各自的头,那么它将取决于。通常,文件应该包括它们需要的文件。
如果源文件需要一个头文件,但是它自己的头文件不需要该头文件,那么包含应该放在源文件中,而不是它的头文件中。原因之一是,每个文件只包含它所需的文件,这在概念上更清晰,因此很容易判断出依赖项是什么。另一个原因是它减少了变化的影响。
让我们看一个例子。假设您有foo.c和foo.h,而foo.c需要foodep.h编译,但是foo.h没有:
备选案文1: foo.h
#包括"foodep.h“
现在假设还有许多其他文件foo1.h、foo2.h、foo3.h等等,包括foo.h。然后,对foodep.h的任何更改都会影响所有其他文件及其依赖的头文件和源文件。
备选案文2: foo.c
#包括"foodep.h“
现在,没有其他文件具有foodep.h的可见性。对foodep.h的更改只影响foo.c。
通常,尝试应用与面向对象编程相同的实践-封装和最小化更改的范围。
发布于 2014-02-03 05:18:51
查看这一点的简单方法是,您应该始终包含提供在程序中使用的函数/别名/宏的标头,无论它们是否实际需要包含,都应该留给编译器处理。
这是因为每个标头都是在#ifdef - #endif子句下定义的,其条件是某些特定于头的宏(如果您定义了自己的标头,则有必要这样做,以避免多个包含,从而避免痛苦的编译器错误)。
因此,我的建议是,如果在程序中使用bool,则应该包括stdbool.h。如果编译器已经将其包含在其他标头的定义中,那么它将不再包含stdbool。
https://stackoverflow.com/questions/21519960
复制相似问题