假设我有一个C程序,它被破坏为一组*.c和*.h文件.如果一个文件中的代码使用另一个文件中的函数,那么我应该在哪里包含头文件?在使用该函数的*.c文件中,或在该文件的标题内?
例如文件foo.c
包含foo.h
,其中包含所有声明foo.c
; 同样的bar.c
和bar.h
.调用foo1()
内部的函数,在其中声明和定义.现在的问题是,我应该包括内部还是内部?foo.c
bar1()
bar.h
bar.c
bar.h
foo.h
foo.c
对于这些问题,一套好的经验法则是什么?
你应该在foo.c中包含foo.h. 这样,包含foo.h的其他c文件将不会不必要地携带bar.h.这是我对包含头文件的建议:
就像其他人指出的那样,标头foo.h应该声明能够使用源文件foo.c提供的功能所必需的信息。这将包括foo.c提供的类型,枚举和函数。(您不使用全局变量吗?如果您使用全局变量,那么它们也将在foo.h中声明。)
标头foo.h应该是自包含的并且是幂等的。自包含意味着任何用户都可以包含foo.h,而不必担心可能需要其他标头(因为foo.h包含那些标头)。幂等意味着,如果多次包含标头,则不会造成损坏。这是通过经典技术实现的:
#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
...rest of the contents of foo.h...
#endif /* FOO_H_INCLUDED */
Run Code Online (Sandbox Code Playgroud)
问的问题:
文件foo.c包含foo.h,其中包含foo.c的所有声明;bar.c和bar.h相同。foo.c中的函数foo1()调用bar1(),该函数在bar.h中声明并在bar.c中定义。现在的问题是,我应该在foo.h中还是在foo.c中包含bar.h?
这将取决于foo.h提供的服务是否依赖于bar.h。如果其他使用foo.h的文件需要使用bar.h定义的类型或枚举之一才能使用foo.h的功能,则foo.h应该确保包含了bar.h(包括它)。但是,如果bar.h的服务仅在foo.c中使用,而使用foo.h的人则不需要它们,则foo.h不应包含bar.h