如何在C中构造#includes

Pag*_*gas 6 c header include

假设我有一个C程序,它被破坏为一组*.c和*.h文件.如果一个文件中的代码使用另一个文件中的函数,那么我应该在哪里包含头文件?在使用该函数的*.c文件中,或在该文件的标题内?

例如文件foo.c包含foo.h,其中包含所有声明foo.c; 同样的bar.cbar.h.调用foo1()内部的函数,在其中声明和定义.现在的问题是,我应该包括内部还是内部?foo.cbar1()bar.hbar.cbar.hfoo.hfoo.c

对于这些问题,一套好的经验法则是什么?

kgi*_*kis 7

你应该在foo.c中包含foo.h. 这样,包含foo.h的其他c文件将不会不必要地携带bar.h.这是我对包含头文件的建议:

  • 在c文件中添加包含定义 - 这样在读取代码时文件依赖性更加明显.
  • 将foo.h拆分为两个单独的文件,比如foo_int.h和foo.h. 第一个只携带foo.c所需的类型和前向声明.foo.h包含外部模块所需的功能和类型.这就像foo的私人和公共部分.
  • 避免交叉引用,即foo引用bar和bar引用foo.这可能会导致链接问题,也是设计糟糕的表现

  • 创建标头的唯一原因是因为多个源文件需要该信息.在foo.h之外不应该需要foo_int.h头文件,所以不应该创建或使用它 - 它的内容可以直接放在foo.c中. (3认同)

Jon*_*ler 5

就像其他人指出的那样,标头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