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

时间:2014-08-25 09:33:33

标签: c++ c include header-files difference

很多时候,当我看到其他人的代码时,我看到有些代码包含.h文件,有些则包含.c / .cpp文件。有什么区别?

4 个答案:

答案 0 :(得分:7)

取决于文件中的内容。

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

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你可以看一下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)。

答案 3 :(得分:1)

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

  1. 将代码拆分为单独的源文件是有原因的,尽管它应编译为单个模块。例如,某些功能的不同版本不能从其他模块中看到。因此,它们被声明为static,但包含哪个版本受编译选项的约束。另一种变体是规模和/或维护凭证问题。
  2. 包含的文件本身不是作为项目模块编译的。因此,其导出的定义与包含该文件的模块不冲突。
  3. 在这里,我使用术语定义声明,其方式如下:

    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)用于此类文件,以避免读者混淆。