繁体   English   中英

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

[英]What is the difference between including a .c file and a .h file

很多时候,当我看到其他人的代码时,我看到一些包括.h文件,有些包括.c / .cpp文件。 有什么不同?

这取决于文件中的内容。

#include预处理程序指令只是在原始文件中的那一点插入引用的文件。

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

头文件通常是通过#include设计并打算使用的。 源文件不是,但它有时是有道理的。 例如,当您有一个仅包含定义和初始化程序的C文件时:

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

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

.h文件称为头文件,它们不应包含任何代码(除非它恰好包含有关C ++模板化对象的信息)。 它们通常包含函数原型,typedef,#define语句,这些语句由包含它们的源文件使用。 .c文件是源文件。 它们通常包含在相应头文件中原型化的函数的源代码实现。

来源 - http://cboard.cprogramming.com/c-programming/60805-difference-between-hc-files.html

你可以看一下gcc网站( https://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html ),它报告了你可以在C / C ++中使用的所有扩展的一个很好的总结:

C ++源文件通常使用后缀“.C”,“。cc”,“。cpp”,“。CPP”,“。c ++”,“。cc”或“.cxx”之一; C ++头文件通常使用'.hh','。hpp','。H'或(对于共享模板代码)'。tcc'; 和预处理的C ++文件使用后缀'.ii'。 GCC识别具有这些名称的文件并将它们编译为C ++程序,即使您以与编译C程序相同的方式调用编译器(通常使用名称gcc)。

包含带声明的头文件是在项目中进行一致声明的主要,推荐和几乎在任何地方使用的方法。 包含另一个源文件是另一种(非常罕见)类型的野兽,它在特定条件下是有用的和可能的:

  1. 尽管将代码编译为单个模块,但有理由将代码拆分为单独的源文件。 例如,某些功能的不同版本不能从其他模块中看到。 因此,它们被声明为static但包含的版本受编译选项的约束。 另一种变体是大小和/或维护凭证问题。
  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)用于此类文件,以避免读者混淆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM