c++ 为什么会有头文件

突然脑子里蹦出一个问题,为什么c++ 会有头文件怎么个东西,而诸如java,python就没有这玩意呢,是不是历史遗留问题呢。我先以函数定义来看看c++的语法吧。

我们先写两个cpp,man.cpp中引用了add.cpp中add函数

//add文件
int add(int x, int y)
{
    return x + y;
}
//main文件
#include <iostream>
 
int add(int x, int y); //函数声明
 
int main()
{
    std::cout << "The sum of 3 and 4 is " << add(1, 1) << std::endl;
    return 0;
}

因为这样避免写头文件的方式如果直接用g++ main.exe是会报错的,为了让上面正常运行我们要手动控制编译,像下面这样就能得到结果了

g++  main.cpp add.cpp -o add.exe

回到原题,我们先假设没有上面的函数声明会怎么样。首先编译器就会报错

in.cpp: In function 'int main()':
main.cpp:6:41: error: 'add' was not declared in this scope
     std:cout<<"The sum of 3 and 4 is "<<add(3,4)<<std::endl;
                                         ^~~
main.cpp:6:41: note: suggested alternative: 'rand'
     std:cout<<"The sum of 3 and 4 is "<<add(3,4)<<std::endl;
                                         ^~~
                                         rand

不仅提示了没有声明函数,还贴心提示可以用rand函数代替。可以看出其实编译器非常的聪明,完全就知道这是个用到2个整数的函数。

而只编译main.cpp的时候他又提示我们没有定义add函数。

D:\TEMP\ccEMSlyf.o:main.cpp:(.text+0x34): undefined reference to `add(int, int)'
collect2.exe: error: ld returned 1 exit status

可见c++语法规定如果你写了一个函数(define),你必须主动声明告诉c++编译器(declare)。

这样的好处可不是为了避免使用前必定义

#include<iostream>
using namespace std;
// int add(int x, int y); //函数声明
int add(int x, int y)
{
    return x + y;
}
int main(){

    std:cout<<"The sum of 3 and 4 is "<<add(3,4)<<std::endl;

}

是为了像上面一样把代码逻辑分开。把各个代码按照逻辑拆分成一个一个小块,方便维护管理。可以单独创建一个include 文件夹放入我们的头文件add.h

//include/add.h
#ifndef ADD_H
#define ADD_H
 int add(int x, int y);
#endif
//src/main.cpp
#include<iostream>
#include"include/add.h"
using namespace std;

int main(){

    std:cout<<"The sum of 3 and 4 is "<<add(3,4)<<std::endl;

}

add.cpp保持不变

g++   main.cpp add.cpp -o add.exe -I "../"

指定完头文件目录,你会发现结果和之前一样,但是更加的模块化了,想使用哪个模块,就加载对应模块的头文件就行了。

同时也是为了省内存。古时候不像现在动辄几g几十g的电脑。像java和python 这种解释型的语言都是运行的时候加载代码再翻译,根本不差这这点算力和内存,可几十年前那时候的计算机才十几k,甚至几k。为了省内存,搞一个声明,留一个标记给连接器对接就行,一小块一小块编译。耗时但是高效啊。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,文件(header file)用于声明和定义类、函数、变量等的接口。文件通常包含了函数和类的声明、常量的定义、类型的定义以及必要的注释说明,它们被其他源文件(.cpp文件)引用和包含。 文件的主要作用是提供代码的模块化和可重用性,具体原因如下: 1. 分离接口和实现:文件中只包含函数和类的声明,而不包含具体的实现。这样可以将接口与实现分离,使程序结构更清晰、代码更易维护。 2. 提供公共接口:文件可以定义公共的函数、类和常量等,供其他源文件进行引用和使用。通过文件,可以在不暴露实现细节的情况下,使代码模块之间进行交互和协作。 3. 减少编译时间:当多个源文件需要使用同一个函数或类时,可以将其声明放在文件中,在需要使用的源文件中引用该文件。这样可以避免在每个源文件中重复写相同的声明,减少了代码冗余,并可以提高编译速度。 4. 方便代码管理:文件使得代码组织更加清晰,便于查找和维护。通过合理划分和组织文件,可以使代码更易读、更易于扩展和重用。 一般来说,每个源文件都应该有与之对应的文件,以便在需要的时候进行包含。在编写C++程序时,合理使用文件可以提高代码的可维护性和可扩展性,同时也有助于提高开发效率。 希望这个解答对你有帮助。如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值