正如其他人所指出的,头文件 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 */
问题问:
文件 foo.c 包括 foo.h,其中包含 foo.c 的所有声明;bar.c 和 bar.h 相同。foo.c 中的函数 foo1() 调用 bar1(),它在 bar.h 中声明并在 bar.c 中定义。现在的问题是,我应该将 bar.h 包含在 foo.h 中,还是包含在 foo.c 中?
这将取决于 foo.h 提供的服务是否依赖于 bar.h。如果使用 foo.h 的其他文件需要 bar.h 定义的类型或枚举之一才能使用 foo.h 的功能,则 foo.h 应确保包含 bar.h(通过包含它)。但是,如果 bar.h 的服务只在 foo.c 中使用,而使用 foo.h 的人不需要,那么 foo.h 不应该包含 bar.h