我应该在主文件中包含 .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.c
。 main.c
中调用 signal
的其他代码保留在 main.c
.
中
现在main.c
不会编译,因为它使用了signal
,但是在main.c
中没有直接或间接包含<signal.h>
。
因此,在每个源文件中直接为源文件直接使用的每个函数(或其他标识符)包含一个 header 文件的习惯可以避免这个问题。
但是,这是一个小问题。编译失败会第一时间发现并及时更正。
可能还有其他问题,比如作者可能不小心使用了标准库函数而忘记包含相应的header,源代码也包含相同的non-standard声明标识符。 (很容易忘记标准库中每个标识符的名称,并将一些更简单的名称用于其他目的。)一些编译器可能会警告 non-standard 与标准库标识符冲突的声明。但是,您的编译器不会,这种情况可能会导致程序出现错误,因为您打算使用标准库函数的地方将改为使用替代声明。因此,始终为您使用的标准库函数包含一个标准库 header 可以避免这种情况。
我有一些函数(如 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.c
。 main.c
中调用 signal
的其他代码保留在 main.c
.
现在main.c
不会编译,因为它使用了signal
,但是在main.c
中没有直接或间接包含<signal.h>
。
因此,在每个源文件中直接为源文件直接使用的每个函数(或其他标识符)包含一个 header 文件的习惯可以避免这个问题。
但是,这是一个小问题。编译失败会第一时间发现并及时更正。
可能还有其他问题,比如作者可能不小心使用了标准库函数而忘记包含相应的header,源代码也包含相同的non-standard声明标识符。 (很容易忘记标准库中每个标识符的名称,并将一些更简单的名称用于其他目的。)一些编译器可能会警告 non-standard 与标准库标识符冲突的声明。但是,您的编译器不会,这种情况可能会导致程序出现错误,因为您打算使用标准库函数的地方将改为使用替代声明。因此,始终为您使用的标准库函数包含一个标准库 header 可以避免这种情况。