c - 我需要在 C 程序中编译头文件吗?

标签 c gcc

有时我看到有人这样编译C程序:

gcc -o hello hello.c hello.h

据我所知,我们只需要将头文件放入 C 程序中,例如:

#include "somefile"

并编译C程序:gcc -o hello hello.c

我们什么时候需要编译头文件或者为什么?

最佳答案

首先,一般来说:

如果这些 .h 文件确实是典型的 C 风格头文件(而不是恰好以 .h 扩展名命名的完全不同的文件),那么不,没有理由独立“编译”这些头文件。头文件旨在包含在实现文件中,而不是作为独立的翻译单元提供给编译器。

由于典型的头文件通常只包含可以在每个翻译单元中安全重复的声明,因此完全可以预期“编译”头文件不会产生有害后果。但同时它不会实现任何有用的东西。

基本上,将 hello.h 编译为独立的翻译单元等同于创建仅包含 #include "hello.h"的退化 dummy.c 文件 指令,并将该 dummy.c 文件提供给编译器。它会编译,但没有任何意义。


其次,专门针对 GCC:

许多编译器会根据文件扩展名对文件进行不同的处理。当扩展名为 .h 的文件作为命令行参数提供给编译器时,GCC 会对其进行特殊处理。 GCC 没有将其视为常规翻译单元,而是为该 .h 文件创建了一个预编译头文件。

您可以在这里阅读:http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

因此,这就是您可能会看到 .h 文件被直接提供给 GCC 的原因。

关于c - 我需要在 C 程序中编译头文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416719/

相关文章:

c - TicTacToe 的 Minimax 算法无法正常工作

c - WTSEnumerateServers ERROR_INVALID_DOMAINNAME

用 .h 编译 .so

c++ - 在 MinGW/GCC 中编译 tvmet 库时出现 "::drem has not been declared"

c - 从C中的文件读取,包括字符和整数

c - 什么时候可以将 C 中的函数作为系统调用来调用

c - 在 Solaris 中列出共享库的依赖项

c++ - 编译时链接错误故障排除

c++ - gcc 奇怪的转换警告(从 ‘A<B>::count_type {aka short unsigned int}’ 转换到 ‘int’ 可能会改变它的值)

macos - Mac 上的 -lOpenCL 是什么?