zoukankan      html  css  js  c++  java
  • [理解] 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 文件呢? 我想大概一个是为了规范, 还有一个就是 头文件不会被编译, 减少了出错的几率.

    浅薄之谈, 欢迎纠错

  • 相关阅读:
    【LeetCode】204
    【LeetCode】231
    【LeetCode】58
    解决error104 socket error问题
    爬虫问题
    80端口被system占用的问题
    Linux命令行下批量重命名文件名为数字索引编号(0~N.xxx)的方法
    [转]利用excel进行线性规划求解
    python——时间与时间戳之间的转换
    最全中文停用词表整理(1893个)
  • 原文地址:https://www.cnblogs.com/unityworld/p/11773007.html
Copyright © 2011-2022 走看看