本人之前一直理解不了相对路径的概念与使用方法,做项目一直使用的是用绝对路径(在项目中添加头文件包含或者引用路径),也一直没出什么问题,就没怎么在意。
直到最近在做项目的过程中,由于在自己办公电脑上开发的项目经常要拷贝到其他电脑上去执行,造成绝对路径(存放的盘、文件夹位置)发生变化,项目修改后编译无法通过,每次都需要重新修改包含路径,非常麻烦,这才意识到使用绝对路径的弊端。通过自己的小半天(大部分帖子都是抄来抄去或者无参考价值)的资料查找和验证,终于弄懂了相对路径是怎么一回事,特此记录下来。也帮助被此问题困扰的同行理解。
绝对路径:指文件所在文件夹的具体位置。具体到哪个盘,那个文件之下。比如,我的桌面有一个C++文件夹,它的绝对路径为--C:\Users\document\Desktop\C++。
图1
相对路径:对于一个文件来说,它的具体位置将失去意义。它只针对引用它或者被它引用的文件有意义。下面举个栗子说明。
假如现在我有一个工程文件夹Prj_Example,Prj_Example文件夹下有2个子文件夹,文件夹A和文件夹B,A下有一个头文件A.H和子文件夹a,子文件夹a中有头文件a.H。B下有一个头文件B.H和文件夹b,子文件夹b中有头文件b.H。如下图:
图2. A.H的位置
图3. a.H的位置
现在,假如a.H想要引用A.H。A.H相对a.H来说,它和a.H的上一级目录a在同一个路径之下,所以a.H引用A.H时必须返回至上一级A才能寻找到A.H的位置,在a.H中需添加语句#include“../A.H”。反之,A.H引用a.H,A.H与a.H的上一级目录a处于同级目录,所以只需添加语句#include"a/a.H"即可。
其中, ../代表返回上一级, ../../代表返回上二级,依次类推。
更进一步,如果a.H要引用B.H。B.H相对a.H来说,它的上一级目录B和a.H的上二级目录A在同一个路径之下,所以a.H引用B.H时首先必须返回至二者最近的共同目录下,再进行寻址才能寻找到B.H的位置。所以,在a.H中需添加语句#include“../../B/B.H”。.
同理可知,如果a.H想引用b.H,根据以上分析,只需添加语句#include“../../B/b/b.H”即可。
不知道有没有分析清楚,初次理解可能有点费劲,建议不懂多看两遍,最好建个工程引用一下可以方便理解。有问题欢迎留言,实践出真知,共勉。
文章评论(0条评论)
登录后参与讨论