可能作为现在的软件系统而言,已经不大可能将所有的代码写到同一个文件当中去编译,就像类的定义,你不大可能将声明和定义放到一个头文件中,如果你非要这么做的话,很悲剧的时,你可能经常会遇到头文件的循环包含,而出现ld错误带来的满屏未定义变量,所以说她很好的提供程序逻辑块的跟别编译。
还有一个就是条件编译。现在很多的开源library为了支持平台的可移植性,都使用条件编译将代码隔离开,因为不同的系统底层提供的一些api往往是不一样的,比如boost::asio中,在windows下,有现成的iocp可用,可以直接使用,但是很不幸的是,在linux下,好像还没有可实际使用的异步io,可能你会说不是有,aio_read,aio_write....据说,效率不怎么样,具体怎么样,我是没用过的,而是,在linux下就用poll,epoll,select,来实现,不同版本的linux,可能不一样,那怎样才能将他们用到一起呢,条件编译就很好的支持类这些,或者是你的代码中可能因为版本或者调试方面的问题,想要走不同的流程或者不同的输出结果,你也可以使用条件编译,
头文件的重复包含从而导致变量,或者类的重复定义,这可能也是其中的一个问题,比如:
//A文件
class a
{
};
//B文件
#include "A.h"
class b : public a
{
};
//C文件
#include "A.h"
class c: public a
{
};
B和C文件都包含类A文件,想一下如果不用条件编译的话,那就回造成,多次包含A而造成A的重复定义,从而出现难以理解的编译错误,这就是俗称的头文件保护符,编译器变量有两种状态,一种是已定义,另一种就是未定义,当然你也可是用#if defined(...)来判断他是否一定义。
还有一个标较好地策略是,将const变量定义在头文件中,因为const变量默认为他的文件的局部变量,现在想到的也就这些,还有什么其他的用途,望大家指出,thank you!