包含一个.c文件和一个.h文件有什么区别?

5

很多时候当我看其他人的代码时,我发现有些人包含了一个.h文件,有些人则包含了一个.c/.cpp文件。这两者有什么区别呢?


4
从技术上讲,你可以包含任何你喜欢的文件名,并且该文件只是被打开并覆盖。通常,.h 文件保存函数等的 声明,而 .cpp 文件保存实际 定义(调用函数时无需查看)。 #include 一个 .cpp 文件相当奇怪。 - BoBTFish
2
主要的区别在于,包含.c/.cpp文件几乎总是会导致严重的问题。 - πάντα ῥεῖ
什么样的问题? - odbhut.shei.chhele
1
在大多数情况下,在链接阶段出现“多重定义”错误。 - πάντα ῥεῖ
如果不麻烦的话,您可以解释一下给我听或者给我一个链接吗?谢谢:) - odbhut.shei.chhele
1
@eddard.stark 请查看这里(以及相应的问题)。 - πάντα ῥεῖ
4个回答

7

这取决于文件中包含的内容。

#include 预处理指令只是简单地在原始文件中插入引用的文件。

因此,实际的编译器阶段(在预处理器之后运行)看到的是所有插入操作的结果。

头文件通常设计和意图是通过#include使用。源文件不是这样设计的,但有时候也是有意义的。例如,当您有一个只包含定义和初始化程序的C文件时:

const uint8_t image[] = { 128, 128, 0, 0, 0, 0, ... lots more ... };

那么,使用 #include 将其提供给某些代码是有意义的。它是一个C文件,因为它实际上定义了(而不仅仅是声明)一个变量。也许它被保存在自己的文件中,因为该图像从用于编辑的其他(图像)格式转换为C源。


那么我应该在.h文件中放什么,在.c文件中放什么? - odbhut.shei.chhele
我应该把函数原型放在.h文件中,把函数放在.c文件中吗? - odbhut.shei.chhele
2
@eddard.stark 是的,这很常见。头文件用于描述由C文件实现的代码模块的公共接口。不要包括任何static函数原型,它们不是公共的。 - unwind

2
“头文件”是指“.h”文件,它们不应包含任何代码(除非它恰好包含有关C++模板化对象的信息)。它们通常包含函数原型、typedef、#define语句,这些语句被包含它们的源文件使用。而“.c”文件则是源文件,它们通常包含在适当的头文件中声明的函数的源代码实现。”
来源- http://cboard.cprogramming.com/c-programming/60805-difference-between-h-c-files.html

1
包含声明头文件是制定项目中一致声明的主要、推荐和几乎用于任何地方的方法。包含另一个源文件是另一种(非常罕见的)类型,只有在特定条件下才有用且可能:
1.尽管应将其编译为单个模块,但有理由将代码拆分为单独的源文件。例如,某些函数有不同版本,不应从其他模块中可见。因此,它们被声明为静态的,但包含哪个版本由编译选项控制。另一种变体是大小和/或维护凭据问题。 2.所包含的文件未作为项目模块进行编译。因此,其导出定义与包含该文件的模块不冲突。
这里,我使用术语“定义”和“声明”,其中以下内容是声明:
extern int qq;
void f(int);
#define MYDATATYPE double

以下是定义:

int qq; // here, the variable is allocated and exported
void f(int x) { printf("%d\n", x); } // the same for function

(另外,声明包括在类定义内部声明具有主体的C++方法。)
无论如何,将另一个.c/.cxx等文件包含到源文件中的情况非常混乱,应该避免,直到确实需要。有时会为这些文件使用特定的后缀名(例如.tpl),以避免读者的困惑。

1
你可以查看gcc网站(https://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html),其中报告了您可以在C / C ++中使用的所有扩展的概要:
C++源文件通常使用以下后缀之一:“.C”、“.cc”、“.cpp”、“ .CPP”、“.c ++”、“.cp”或“.cxx”; C ++头文件通常使用“.hh”、“.hpp”、“.H”或(对于共享模板代码)“.tcc”; 预处理的C ++文件使用后缀“.ii”。 GCC识别具有这些名称的文件,并将它们编译为C ++程序,即使您以编译C程序相同的方式调用编译器(通常使用名称gcc)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接