※C++随笔※=>☆VS工具☆=>※№统一管理头文件路径和编译宏
统一管理头文件路径和编译宏
C++头文件
在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。而且 .c就是你写的程序文件。
一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。头文件的主要作用在于调用库功能,对各个被调用函数给出一个描述,其本身不包含程序的逻辑实现代码,它只起描述性作用,告诉应用程序通过相应途径寻找相应功能函数的真正逻辑实现代码。用户程序只需要按照头文件中的接口声明来调用库功能,编译器会从库中提取相应的代码。
从以上结构图来看,头文件是用户应用程序和函数库之间的桥梁和纽带。在整个软件中,头文件不是最重要的部分,但它是C语言家族中不可缺少的组成部分。做一个不算很恰当的比喻,头文件就像是一本书中的目录,读者(用户程序)通过目录,可以很方便就查阅其需要的内容(函数库)。在一本书中,目录固然重要,但绝对不是一本书的核心的、最重要的部分。
C++条件编译宏
一般情况下,源程序中所有的行都参加编译。但有时希望对其中一部分内容只在满足一定条件下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”(conditional compile)。条件编译语句排版时,需考虑以下三种位置:1)条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中);2)条件编译语句块嵌套在函数体之外(主要在(.c)文件中);3)条件编译语句嵌套在函数体内 (主要在(.c)文件中)。条件编译指令将决定那些代码被编译,而哪些是不被编译的。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
------------------------------------------------------------------------------------------------------------------------------------
开发过程中,上述C++头文件和C++条件编译宏可谓是让我们头痛的事了。特别是当项目比较大时,处理这些问题的维护成本会不断的加大。
经常性我们在开发时,都是随意的在某个文件里增加C++条件编译宏。或者在预编译头文件 "stdafx.h" 中加入条件编译宏。当然这些办法都可以使我们解决某些问题,然而当某个Trunk上的代码有多套条件编译宏时,此时维护起来可谓是相当麻烦了。并且如果一个解决方案内有多个项目也不方便在各个项目中预编译头文件 "stdafx.h" 中进行编辑。
头文件的管理更是让大家想死的心都有了,某A君写了代码,移植到某B君机器上。然后发现了成千上万个Error,彻底疯了。毫无疑问这个肯定是头文件引起的,但是面对如此多的Error,并且如果A君头文件乱放的话,相信此工程量应该是相当巨大的吧!同样我也相信很多人和我一样碰到过这样的类似事件。毕竟每个人的Coding风格和习惯都是不一样的,难免有一些风格不大好的代码突然呈现在大家眼前。
那么如何很好的管理C++头文件和C++条件编译宏呢?
这里我只简明的说明下C++头文件和C++条件编译宏的管理,并不涉及命名形式。
那用最近在写的设计模式来简要的说明下,当然也可能此风格并不合适各位,大家一起讨论嘛!
针对不同的内容我们新建立相应的目录
每个目录里.cpp放在相应的目录内,并再新建一个groupinc的一个子目录用来存放.h文件
实际的目录结构如下:
以上为文件的存放风格习惯。然而主要问题还是相对和绝对路径问题,一般情况下我们会尽量使用相对路径。如果各位会使用批处理命令的话使用绝对路径也是蛮不错的一种选择。
项目=>Properties=>C++=>Additional Include Directories
相对路径与绝对路径
相对路径:即相对当前项目的位置。一般../ 开头
绝对路径:即实际电脑中存储的位置。一般以D\: 开头(盘符)
上述使用VS2005提供的设置来进行处理的。这样相对比较麻烦,我推荐大家使用文件形式进行处理这些事务。
项目=>Properties=>C++=>Additional Include Directories
如图中所述,使用@CompOptProj.txt @IncPathGroup.txt 二个文件来进行管理条件编译宏 和头文件路径
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
本节笔记到这里就结束了。
潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
编程开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~