其实一直搞不懂为什么头文件和其他cpp文件之间的关系,今晚索性一下整明白

【c++】解析多文件编程的原理

  • a.cpp
#include<stdio.h>

int main(){
a();
}
  • b.cpp
void a(){
printf("b.cpp\n");
}

首先看下这两个程序,你们是否存在疑问?这个能编程成功吗,编译成功了,又是否能成功运行呢?那再看看下面这个

  • a.cpp
#include<stdio.h>
void a();
int main(){
a();
}
  • b.cpp
void a(){
printf("b.cpp\n");
}

下面的是否能成功运行呢?

答案是上面的会过不了编译,下面的可以成功运行

那么你再看看下面的

  • a.cpp
#include<stdio.h>
void a();
int main(){
a();
}

如果只有a.cpp文件又是怎么样的呢?

答案是编译可以通过,但过不了链接

我之前就被这些绕来绕去给绕晕了,hhhh~

场景揭密分析

  • 首先我觉得这里更多的是有关编译和链接的知识。先看第一种情况,第一种是在a.c中未声明出函数,所以在编译期间就被干掉了。

程序在编译时,会检查cpp文件中是否有某个函数或者变量的定义,如果有,就可以通过编译,不论有没有实现定义。这也就为什么上面会死在编译期。

  • 再看第三种情况,有声明,但却没有实现,以至于死在了链接期

程序在编译后,就开始进行链接了,可以想象定义和声明就是一对接口,和动态链接库有点相似。程序在链接期间首先会在自己的文件中拿着函数名,找到对应的函数体。如果在自身的范围内没有找到,就会按指定的查找顺序去找(一般是:文件》项目》环境目录),如果都没有找到就会报错。反馈出链接失败。

  • 最后看看第二种情况

上面讲了编译和链接的过程,所以第二种是可以成功执行的。

头文件的工作原理

首先试想编译和链接的关系已经弄明白了。那么就可以知道,使用函数或者其他的东西,需要先声明。那么如果在多个文件中出现多个相同的函数,要你声明的话。你会发现声明了一堆重复但不可或缺的声明。这时候就需要使用头文件了。头文件中主要的目的就是声明,而在编译的时候,编译器会将头文件全部复制到包含文件中,从而实现声明。

之前的我还以为a.cpp和a.h总有种必然的联系。现在终于释然了,Ye~

头文件之 为什么不要在我里面声明变量

很多人会想着两个文件使用全局变量,那么这个时候在一个头文件中定义一个变量,在其他文件中包含该头文件不久可以实现了全局的效果吗?

实践后会发现是报错---重复定义。。。

又开始走盲区了

首先是由于头文件中定义,那么当你被多个其他文件包含的时候,编译器会讲变量中的定义都复制一份到各个文件中,而同一个项目中的变量是互可见的,所以就会导致最后的重复定义的问题。

但我又有个疑惑,函数不也是这么操作的吗?为什么函数不报错。

困惑逐渐增多

后来一想,函数是先在自己的文件中搜寻,没有的话才会去其他文件中搜寻,而且你会发现函数如果被实现了,但在自己的文件中再实现一次,也是允许的。而且最后是调用最近的那个函数体。

但又一想,为啥变量不可以这么搜寻???

呀呀呀呀!!!,似乎又陷入死局。

下次再想吧,有点懵了!!!

好像又有希望了!!!

https://zybuluo.com/uuprince/note/81709

原来void a();这种只是声明,但int a;这种就是声明和定义同时。



成功!!!

【c++】解析多文件编程的原理的更多相关文章

  1. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  2. 解析Markdown文件生成React组件文档

    前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...

  3. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  4. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  5. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  6. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  7. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...

  8. Java环境解析apk文件信息

    概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...

  9. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

随机推荐

  1. hdu 1506 Largest Rectangle in a Histogram(DP)

    题意: 有一个柱状图,有N条柱子.每一条柱子宽度都为1,长度为h1...hN. 在这N条柱子所构成的区域中找到一个最大面积,每平方米3块钱,问最多赚多少钱. 输入: 1<=N<=10000 ...

  2. Linux题目学习

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点来标识 ...

  3. shell 脚本二进制安装mysql

    以下脚本的手动安装连接:https://www.cnblogs.com/leihongnu/p/12581793.html [ #/bin/bash#脚本安装 mysql,上传安装包至 /rootcd ...

  4. Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例

    Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例 一位客户最近觉得觉得他的LED台灯好闪, 于是拆了看看,里面的控制板是这样的: 干掉双色调光功能,只调亮度的话闪烁的状况能好转 ...

  5. php swoft redis 发布和订阅

    //订阅 public function subscribe() { /* @var \Swoft\Redis\Redis $redis */ $redis = App::getBean(\Swoft ...

  6. springcloud优雅停止上下线与熔断

    SpringCloud 服务优雅上下线 Spring Boot 框架使用"约定大于配置"的特性,优雅流畅的开发过程,应用部署启动方式也很优雅.但是我们通常使用的停止应用的方式是 k ...

  7. vue脚手架项目如何在控制台打印组件实例

    需要在浏览器上安装拓展程序vue开发工具,安装好后在控制台上输入$vm即可打印vue组件实例对象. Vue2.3开发工具都有,可自行下载 百度网盘链接提取码:si5l

  8. [jmeter]Jmeter+ant实现接口自动化

    1.安装jmeter 和ant &环境变量配置百度去~ 2.jmeter和ant关联 &将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制到an ...

  9. 2021 数字四川创新大赛WriteUp

    数字四川初赛+复赛wp Web easyphp http://111.9.220.114:50006/.index.php.swp 备份文件泄漏 <?php #error_reporting(0 ...

  10. 如何保证redis中存放的都是热点数据

    当redis使用的内存超过了设置的最大内存时,会触发redis的key淘汰机制,在redis 3.0中有6种淘汰策略: noeviction: 不删除策略.当达到最大内存限制时, 如果需要使用更多内存 ...