上回说到pp库的第一大类功能是关于宏语言计算的支持。今天就来讲讲这个类型的应用。
首先看个例子。打开你的文本编辑器,输入以下内容,并保存为test.cpp
:
#define N 15
#define M (N*(N+1))/2
int m = M;
这段程序用宏设置了一个计算公式:m = (n*(n+1))/2
。我们希望经过预编译,它能输出如下的代码:
int m = 120;
现在我们看看实际情况,执行以下命令:
> g++ -P -E test.cpp > test.out.cpp
-E参数指定g++只进行预编译,而-P选项则禁止预编译器产生一些源代码行号等信息,这样会使的我们的输出结果更加清爽。下面看看执行的结果:
int m = (15*(15+1))/2;
看来,这和我们的预期有差别。
宏语言的所有操作依靠一个概念:expansion,它其实是对一些字符串进行展开的操作,计算并不是它的强 项。在这个例子里,预编译只处理了字符串的替换,而并没有进行数值的计算。当然,这样做,我们程序运行的结果还是没有错的,但区别在于,它把计算放到了运 行时,这样就消耗了运行时的计算资源。而我们则希望,在N值相对固定的时候,尽量利用编译时的资源,而节省运行时的CPU资源。这在大规模的计算时还是有 用处的。
boost::p