【c++】解析多文件编程的原理
其实一直搞不懂为什么头文件和其他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~
头文件之 为什么不要在我里面声明变量
很多人会想着两个文件使用全局变量,那么这个时候在一个头文件中定义一个变量,在其他文件中包含该头文件不久可以实现了全局的效果吗?
实践后会发现是报错---重复定义。。。
又开始走盲区了
首先是由于头文件中定义,那么当你被多个其他文件包含的时候,编译器会讲变量中的定义都复制一份到各个文件中,而同一个项目中的变量是互可见的,所以就会导致最后的重复定义的问题。
但我又有个疑惑,函数不也是这么操作的吗?为什么函数不报错。
困惑逐渐增多
后来一想,函数是先在自己的文件中搜寻,没有的话才会去其他文件中搜寻,而且你会发现函数如果被实现了,但在自己的文件中再实现一次,也是允许的。而且最后是调用最近的那个函数体。
但又一想,为啥变量不可以这么搜寻???
呀呀呀呀!!!,似乎又陷入死局。
下次再想吧,有点懵了!!!
好像又有希望了!!!
原来void a();这种只是声明,但int a;这种就是声明和定义同时。

成功!!!
【c++】解析多文件编程的原理的更多相关文章
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
- 解析Markdown文件生成React组件文档
前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- CSharpGL(5)解析3DS文件并用CSharpGL渲染
CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...
- 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据
开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...
- Java环境解析apk文件信息
概述:Java解析apk文件,获取apk文件里的包名,版本号,图标文件等; 功能:可以提供给windows和linux平台使用; 原理:利用aapt.exe或者aapt这些anroid平台解析apk文 ...
- 用JAXP的dom方式解析XML文件
用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...
随机推荐
- songwenxin
# -*- coding: utf-8 -*- import wx from modelmngr_frame import MyFrame1 ############################# ...
- docker创建本地主机实例Virtualbox 驱动出错
宿主机系统:Centos7 64位 创建主机实例Virtualbox 命令:docker-machine create -d virtualbox test 连接centos工具:Finalshell ...
- 羽夏看Win系统内核——保护模式篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- C语言图书管理借阅系统——ncurses库的使用
一.前言 作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: ...
- 用 python 解决线性代数中的矩阵运算
用 python 解决线性代数中的矩阵运算 矩阵叉乘 矩阵求逆 矩阵转置 假定AX=B,求解未知矩阵X 矩阵的行列式值|matrix| 未完待续..... import sys from PyQt5. ...
- 通过大量实战案例分解Netty中是如何解决拆包黏包问题的?
TCP传输协议是基于数据流传输的,而基于流化的数据是没有界限的,当客户端向服务端发送数据时,可能会把一个完整的数据报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大报文进行发送. 在这样的情况 ...
- mui中openWindow方法的通用封装
因为做项目跳转新页面和传参的场景太多了,而且有的页面需要的跳转动画也不一样,每次都写一大堆openWindow方法的配置项太麻烦,因此自己简单封装了一个小函数,用来方便webview页面的跳转和传参. ...
- SCTL 涅槃重生:投入 RAL 的怀抱
在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,PMC 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了一条 SQL ...
- Java设计模式之(五)——代理模式
1.什么是代理模式 Provide a surrogate or placeholder for another object to control access to it. Proxy Patte ...
- 浅讲.Net 6之ConfigurationManager
介绍 本节为大家带来.NET 6新增的ConfigurationManager,很多人好奇为啥要讲这个,读取加载配置信息都随手就来了,我们往下看一下. 翻译:这添加了 ASP.NET Core 的新 ...