C++中的头文件和源文件以及主文件之间的关系

2023年5月30日 15:59 ry 818

之前在弄qt项目,发现qt中每次添加一个新文件,都会生成xxx.h和xxx.cpp,由于之前没怎么接触过关于头文件是做啥的,便翻阅了很多文档,加以记录,我们先看头文件的定义:头文件通常包含声明或定义了函数、类、全局变量等元素的语句,而源文件则包含实现这些元素的代码。因此,源文件需要引用相关的头文件来获取需要的声明信息,从而能够正确编译、链接程序。简单地来说,头文件主要用来做一些声明操作,而其对应的源文件(文件名一般和头文件名相同)则做具体实现的操作,我们来举个例子,我们新建一个test.h文件(头文件)

//test.h文件


int a = 10;

然后再同一目录下新建一个test.cpp文件(指明同一目录,由于我用的是vscode软件运行的)

//test.cpp

#include<stdio.h>
#include "test.h"

int main()
{
   printf("%d\n",a);
}

然后运行test.cpp文件,结果如图所示完全没问题,这里我们通过include test.h来链接到头文件。当我们执行运行test.cpp文件时,编译器会先去头文件中查找该元素的声明语句,确定其类型和参数列表等信息,然后再生成目标代码。在链接时,编译器会将所有源文件生成的目标代码组合成最终的可执行程序,并根据各个文件中引用的头文件解决符号依赖关系,将各个模块正确地连接起来。这样的头文件引入很容易理解,但是再qt中,主要运行的代码都在widget.cpp中,如图所示

就如上面红字所描述,如何在widget.cpp文件中引入mainwindow.cpp中的功能呢,答案很简单,在widget.cpp中只需加上#include "mainwindow.h"即可,背后的原理是如何实现的呢?:qtcreator编译器在编译程序时会先去查找QMake生成的Makefile,在其中查找所有需要编译的源文件及其依赖项,并生成目标文件。在这个过程中,编译器会预处理所有的头文件(.h文件)并将它们替换成对应的源码文件,因此,当widget.cpp中包含mainwindow.h文件时,编译器就会将mainwindow.h文件中所包含的其他头文件、类定义和函数声明都加入到当前编译单元的上下文中,使得widget.cpp可以访问mainwindow.cpp中定义的类和函数。然后我区去vscode软件上试了下,发现并不行,代码如下

//test.h文件

void show();

头文件声明show函数,接下来源文件来具体实现show函数

//test.cpp文件
#include<stdio.h>
#include "test.h"
void show()
{
    printf("666");
}

接下来main.cpp文件来使用test.cpp函数中实现的show功能,

//main.cpp文件

#include<stdio.h>


#include "test.h"
int main()
{
    show();
}

在vscode中直接运行main.cpp文件报错了,然后再vs上跑下如图所示

这是为啥呢?:VS Code 本身不是一个编译器,而只是一个源代码编辑器,它并不能自动构建或编译程序。要在 VS Code 中构建和运行 C++ 程序,你需要安装相应的编译器和构建工具,并手动配置一些构建任务,在 VS Code 中需要配置一个 build task 来告诉编译器去哪里查找所有需要编译的源文件及其依赖项,并生成目标文件。这个过程中,头文件的预处理和替换也会被执行。但是这并不是自动发生的,你需要在项目中手动设置好编译器和构建任务。综上所述,终于搞明白了

如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!

欢迎发表评论~

点击此处登录后即可评论


评论列表
暂时还没有任何评论哦...

赣ICP备2021001574号-1

赣公网安备 36092402000079号