[理解] C++ 中的 源文件 和 头文件

我是学 C井 的, 现在在工作中主要使用的编程语言是 Java, 还记得当初在第一次接触到 Cpp 的时候, 听到的第一个概念就是 Cpp 的头文件和源文件, 当初理解了好久, 死活都弄不明白, 现在好歹是理解一点了, 做个笔记

 

  在说头文件和源文件之前, 先来说一下 Cpp 大概的源文件编译过程吧, 新建一个文件 Source.cpp, 然后写

#include <iostream>
using namespace std; int main(){
 cout << "hello world" << endl;
return 0; }

1): 编译开始前, 预处理语句 #include 会将 iostream 文件里的内容拷贝到当前的文件里, 然后使用  iostream 里的 cout 函数

2): Source.cpp 文件会被挨个单独编译为 .obj 文件   这个文件在项目的 debug 文件夹下

 

 

3): 然后 linker 会去找 cout 函数的定义, 因为 #include 已经将 iostream 拷贝到 Source.cpp 文件下了, 所以 linker 会在 Source.obj 里查找 cout 的定义, 并且跟 main 函数里调用的 cout 函数联系起来, 构成一个 .exe 可执行文件

compiling(编译) 和 linker(链接) 会将我们编写的 Cpp 项目文件构建成一个抽象语法树, ,再编译成 CPU 可读的机器码,  然后变成一个可执行文件

所以, 只有 源文件 .cpp 会被编译器编译, 而头文件 .h 是不会被编译的

 

头文件  Header.h ----> 就是将重复到的函数抽象出来放在一个文件中, 这个文件也要进行相应的归类

源文件 Source.cpp --> 就是编译器进行编译的文件, 

非要理解的话, 头文件就是存放 Java 里实现 interface 的函数的文件, 注意, 是已经实现, 不是 interface , 在 Java 中

public interface Math{
  public int function(int a, int b);  
}

然后在实现这个接口 

public class MathImpl implement Math{
     public int function(int a, int b){
        int result = a * b;       
        return result;    
     }
}

但是在 Cpp 的头文件里, 则写的可能是

int function(int a, int b){
    int result = a * b;
    return result;
}

当源文件想要调用这个乘法的函数的时候, 只要

#include "Hread.h"

int main(){
    function(1, 2);
    return 0;
}

这样在编译的时候就会变成

int function(int a, int b){
    int result = a * b;
    return result;
}

int main(){
    function(1, 2);
    return 0;
}

所以头文件大概就是这样用的吧, 不过我想 .cpp 文件也能实现这样的效果啊, 为什么非要专门用一个 .h 文件呢? 我想大概一个是为了规范, 还有一个就是 头文件不会被编译, 减少了出错的几率.

浅薄之谈, 欢迎纠错

 

posted @ 2019-10-31 18:46  苍之弦  阅读(676)  评论(0编辑  收藏  举报