其实一直搞不懂为什么头文件和其他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. 『学了就忘』Linux基础命令 — 19、目录操作的相关命令

    目录 1.ls命令 2.cd命令 (1)绝对路径和相对路径 (2)cd命令的简化用法 3.pwd命令 4.mkdir命令 5.rmdir命令 常用目录操作的相关命令: ls命令 cd命令 pwd命令 ...

  2. zabbix web管理页面 中文乱码问题

    1.在自己电脑上找下图文件,C:\Windows\Fonts 2.上传到 /usr/share/zabbix/assets/fonts/ 目录下 可以看到 graphfont.ttf 是 /etc/a ...

  3. sudo 命令详解

    在linux系统中,由于root的权限过大,一般情况都不使用它.只有在一些特殊情况下才采用登录root执行管理任务,一般情况下临时使用root权限多采用su和sudo命令. 一.su和sudo命令对比 ...

  4. [源码解析] PyTorch 分布式(2) ----- DataParallel(上)

    [源码解析] PyTorch 分布式(2) ----- DataParallel(上) 目录 [源码解析] PyTorch 分布式(2) ----- DataParallel(上) 0x00 摘要 0 ...

  5. (一)初识MySQL

    JavaEE:企业级Java开发  Web 前端(页面:展示,数据) 后台(连接点,连接数据库JDBC,链接前端(控制,控制视图跳转和给前端传递数据)) 数据库(存数据,Txt,Excel,word) ...

  6. 性能优化 | Go Ballast 让内存控制更加丝滑

    关于 Go GC 优化的手段你知道的有哪些?比较常见的是通过调整 GC 的步调,以调整 GC 的触发频率. 设置 GOGC 设置 debug.SetGCPercent() 这两种方式的原理和效果都是一 ...

  7. Spring Boot 2.6.0正式发布:默认禁止循环依赖、增强Docker镜像构建...

    昨天,Spring官方正式发布了Spring Boot今年最后一个特性版本:2.6.0 同时,也宣布了2.4.x版本的终结. 那么这个新版本又带来了哪些新特性呢?下面就一起跟着DD来看看吧! 重要特性 ...

  8. [cf1178G]The Awesomest Vertex

    2020年论文题,这里给出了一个$o(n\log^{2}n+m\log^{3}n)$的做法,例题3即为原题 1.例题1 题面 给定$n$个一次函数$f_{i}(x)$,$m$次查询$F(x)=\max ...

  9. [hdu7099]Just Another Data Structure Problem

    不难发现,问题即求满足以下条件的$(i,j)$对数: 1.$1\le i<j\le n$且$a_{i}=a_{j}$ 2.$\min_{i\le k\le j}y_{k}\ge l$且$\max ...

  10. [atAGC020E]Encoding Subsets

    令$f_{S}$表示字符串$S$的答案(所有子集的方案数之和),考虑转移: 1.最后是一个字符串,不妨仅考虑最后一个字符,即$f_{S[1,|S|)}$(字符串下标从1开始),特别的,若$S_{|S| ...