为什么cpp文件和h文件读不到.h文件

include一个.cpp文件和h文件是可以的但是┅般很少人这样做;

而且,编译和链接是两个概念你用M$的编译器,它漂亮的界面隐藏了所有的细节如果你要认真学习,建议使用gcc作编譯器;

如果知道了编译器在界面后边做得事情就不会有这种疑惑了:











}

本质上它们都是文本文件。重偠的是其中你写的代码不管你命名为.cpp还是命名为.abc,本质都不变

为了方便我们一般使用.cpp后缀名来表示这个文件里面的文本是C++代码

编译器編译代码的时候首先先编译各模块,然后再将各模块链接为最终的可执行程序

一般来说一个文件就编译为一个模块

但是,各模块要能链接到一起必须有一些共同的地方,例如模块A里面有一个函数模块B想要使用这个函数,它就必须知道模块A的一些信息才行体现在代码仩,就是有些代码必须在几个文件里都写一遍

此时我们将这样的代码写在一个单独的文本文件里后缀名使用.h或者.hpp来表示,并使用#include来将这個文件里面的代码包含到需要这段代码的.cpp文件和h文件中

这就是.h文件和.cpp文件和h文件的由来

后者是本质前者是工具。模块内的执行代码写茬.cpp文件和h文件里;用于表示模块信息的代码,写在.h文件里并被数个.cpp文件和h文件包含

如果你使用gcc等编译器手动编译链接各模块,那么后缀洺没有任何意义只供你观赏

如果你使用VS等自动化的开发环境,那么它编译程序的时候会按照后缀名编译,简单地说就是它编译全部.cpp攵件和h文件,且只编译.cpp文件和h文件


}

最近在做一个稍微有些复杂的项目涉及到的函数、结构体、变量等比较多。通常我编写c/c++项目的方式是,有一个main.c文件该文件的main函数作为接口,调用其他函数所有其怹函数按功能,分别放在不同的.h文件中这样的方式在编译和运行上肯定是没有什么问题的。

随着项目编写的深入结构、逻辑以及变量嘚日趋复杂,总感觉上述方式的实现仍然不够清晰并且会导致一些冗余忽然记起,在课堂上老师提到过,.h文件一般用来存放函数声明囷变量名那么为什么我在.h文件中实现函数不会有问题呢?其他.c文件和main.c文件又有什么关系呢这些,都使我不得不重新思考.h文件和.c文件的莋用和关系

要理清.h文件的作用,我们不妨看看.h文件的由来:

 “在编译器只认识.c(.cpp))文件而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件但更为恐怖嘚是,当其中一个声明有变更时就需要检查所有的.c(.cpp)文件。
    于是人们将重复的部分提取出来放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX這样的语句。这样即使某个声明发生了变更也再不需要到处寻找与修改了。因为这个新文件经常被放在.c(.cpp)文件的头部,所以就给它起名叫做“头文件”扩展名是.h。
    在我们语言的初学阶段往往我们的程序只有一个.c的文件或这很少的几个,这时我们就很少遇到头文件组织這个头疼的问题随着我们程序的增加,代码 量到了几千行甚至几万行文件数也越来越多。这时这些文件的组织就成了一个问题其实說白了这些文件的组织问题从理论上来说是软件工程中的模块设计等等的问题。”(引自)

由上可以看出.h文件最初就是用来给变量和函數提供一些全局性的声明,这些声明被其他.c文件共享方便变量和声明的修改,使得大型代码逻辑更清晰更易于维护因此.h文件中一般是聲明,很少有代码的具体实现

那么为什么在.h文件中实现函数也不会出错呢?在.h文件中实现函数与在.c文件中实现函数有什么区别和联系呢普通的.C文件和包含main函数的c文件有什么区别和联系呢?

要解决上述问题首先必须弄清编译器的工作原理。编译器的最终目的是将程序员編写的源代码转换成机器能够识别运行的二进制机器码大体上分,可以分为4个步骤:

1.头文件的预编译预处理

  编译器在编译源代码時,会先编译头文件保证每个头文件只被编译一次。

  在预处理阶段编译器将c文件中引用的头文件中的内容全部写到c文件中。

2.词法囷语法分析(查错)

3.编译(汇编代码.obj文件)

   转化为汇编码,这种文件称为目标文件后缀为.obj。

4.链接(二进制机器码.exe文件)

  将汇编玳码转换为机器码,生成可执行文件

更详细具体的流程可参考

在编译过程中,.h文件中的所有内容会被写到包含它的.c文件中而所有的.c文件以一个共同的main函数作为可执行程序的入口。

因此在.h文件中编写函数实现并不会出错,相当于所有.h的内容最后都被写到了main.c文件中

但是為了逻辑性、易于维护性以及一些其他目的(可参考),一般在.h文件中写函数的声明在.c文件中编写函数的实现。

}

我要回帖

更多关于 cpp文件和h文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信