做自己的代码库要注意的问题
随着学习的增多,以及对相关的数据结构和算法的实现,发现很多简单的数据结构和输入输出程序最好是使用自己的版本。比如每次使用下面的代码肯定是不可避免的
for(list::iterator i=li.begin();i!=li.end();i++)
cout<<*i<<" ";
cout<<endl;
上面的代码是不是很麻烦呢?你是否想过这样使用自己的测试代码呢?
list_ li;
li.print_list();
那就自己写一些简单的io,list库存放起来吧,每次都使用自己的,既熟悉又方便。
当然,自己的代码只有管理妥当了才会使用方便。这里主要包括:头文件的命名、头文件目录的放置、文件内部类的设计等。
第一,头文件的放置:你可能希望有一个自己的math.h,然后在项目中使用#include"math.h"或者#include<math.h>,但是糟糕的事情要发生了编译器有可能出现:
1>c:\program files\microsoft visual studio 9.0\vc\include\cmath(21) : error C2039: “acosf”: 不是“`global namespace'”的成员
1>c:\program files\microsoft visual studio 9.0\vc\include\cmath(21) : error C2873: “acosf”: 符号不能用在 using 声明中
1>c:\program files\microsoft visual studio 9.0\vc\include\cmath(21) : error C2039: “asinf”: 不是“`global namespace'”的成员
等。
这是因为你的math.h与系统库中的math.h冲突了。怎么办呢?你见过boost库中的包含方法吗?boost库中是这么做的:
#include<boost/random.hpp>
也就是说,他将random.hpp文件放在文件夹中,编译器找到的是这个文件夹boost的上层目录(注意不是boost目录本身,否则你就要使用#include<random.hpp>了),让后#include里就有boost了,就不会和其他文件夹中的random.hpp冲突了。你应该知道怎么创建自己的math.h了吧?是的,把自己经常使用的源文件放在目录中,将这个目录的父目录添加到编译器的附加目录中即可。
做法:右键项目名》属性》配置属性》c/c++》常规》附加包含目录,添加自己的库目录的父目录进来。
第二,头文件与源文件:一般的C++书都告诉我们,将声明放在头文件中(显示有哪些功能);将定义放在源文件中(功能的实现部分);头文件应该包含对应的源文件;使用时只需要包含对应的头文件即可。这都建立在上一步中添加附加目录已经设置的情况下。
第三,让多个项目都使用这个代码库:首先,你应该将自己的代码库放到一个“宝贵的地方”,这个地方可以是百度网盘,金山快盘等网盘在本机上的文件夹中,这样你可以通过网盘实现自动备份。其次,你应该在每个项目的属性中添加你自己的这个库目录地址(见第一,头文件的放置)。这样你可以在一个项目中改动完善你自己的库文件,其他的项目自动使用更改后的版本。