0.2 不用类来实现
此时,我又开始想,对于这个问题,典型的C解决方案会是怎样的。它可能会从一个类似于函数trace()(而不是类)的东西开始:
#include <stdio.h>
void trace(char *s)
{
printf("%s\n", s);
}
它还可能允许我以如下形式控制输出:
#include <stdio.h>
static int noisy = 1;
void trace(char *s)
{
if(noisy)
printf("%s\n", s);
}
void trace_on() { noisy = 1; }
void trace_off() { noisy = 0; }
这个方法是有效的,但与C++(www.cppentry.com)方法比较起来有3个明显的缺点。
首先,函数trace不是内联的,因此即使当跟踪关闭时,它还保持着函数调用的开销 。在很多C的实现中,这个额外负担都是无法避免的。
第二,C版本引入了3个全局名字:trace、trace_on和trace_off,而C++(www.cppentry.com)只引入了1个。
第三,也是最重要的一点,我们很难将这个例子一般化,使之能输出到一个以上的文件中。为什么呢?考虑一下我们会怎样使用这个trace函数:
int main()
{
trace("begin main()\n");
// main 函数主体
trace("end main()\n");
}
采用C++(www.cppentry.com),可以只在创建Trace对象时一次性指定文件名。而在C版本中,情况相反,没有合适的位置指定文件名。一个显而易见的办法就是给函数trace增加一个参数,但是需要找到所有对trace函数的调用,并插入这个新增的参数。另一种办法是引入名为trace_out的第4个函数,用来将跟踪输出转向到其他文件。这当然也得要求判断和记录跟踪输出是打开还是关闭。考虑一下,譬如,main调用的一个函数恰好利用了trace_out向另一个文件输出,则何时切换输出的开关状态呢?显然,要想使结果正确需要花费相当的精力。