我应该在主文件中包含 .h 文件中已经包含的 headers 吗?

Should I include in the main file the headers that are already included in the .h file?

我有一些函数(如 stdio)包含在 .h 文件中,我应该将它们也包含在主文件中还是没用?

include文件有没有guard也没关系。您可以根据需要多次包含它,并且预处理器不会包含包含文件的“主体”,因为它会受到守卫的保护。人类不会注意到现代计算机上的编译时间损失。

但请记住,您不应在头文件中定义任何对象或函数。它应该只包含数据类型声明、函数原型、宏、extern 对象声明和作为异常的静态内联函数定义。

假设 main.c 是一个长文件并且同时使用标准库函数 signal 和您的例程 foo。此外,main.c 包括您的 header "foo.h",其中包括 <signal.h>main.c 本身不包含 <signal.h>.

这将编译,因为编译器在编译 main.c 时会看到 signal 的声明,因为 <signal.h> 是通过 "foo.h".[=36= 包含的]

第二年,您的一位同事重组了软件,他们将 main.c 中使用 foo 的所有代码从 main.c 中移至 bar.c .所以他们也将 #include "foo.h"main.c 移动到 bar.cmain.c 中调用 signal 的其他代码保留在 main.c.

现在main.c不会编译,因为它使用了signal,但是在main.c中没有直接或间接包含<signal.h>

因此,在每个源文件中直接为源文件直接使用的每个函数(或其他标识符)包含一个 header 文件的习惯可以避免这个问题。

但是,这是一个小问题。编译失败会第一时间发现并及时更正。

可能还有其他问题,比如作者可能不小心使用了标准库函数而忘记包含相应的header,源代码也包含相同的non-standard声明标识符。 (很容易忘记标准库中每个标识符的名称,并将一些更简单的名称用于其他目的。)一些编译器可能会警告 non-standard 与标准库标识符冲突的声明。但是,您的编译器不会,这种情况可能会导致程序出现错误,因为您打算使用标准库函数的地方将改为使用替代声明。因此,始终为您使用的标准库函数包含一个标准库 header 可以避免这种情况。