使用c++来实现Trace类,代码如下
#include "stdafx.h"
#include <iostream>
using namespace std;
class Trace
{
public:
Trace() { noisy = 0; f = stdout;}
Trace(FILE *ff) {noisy = 0; f = ff;}
void print(char *s) { if (noisy) { fprintf(f, "%s", s);} }
void on() {noisy = 1;}
void off() {noisy = 0;}
private:
int noisy;
FILE *f;
};
int _tmain(int argc, _TCHAR* argv[])
{
Trace t(stderr);
t.on();
t.print("Begian main()\n");
t.print("End main()\n");
return 0;
}
使用c解决方案;
static int noisy = 1;
void trace(char *s)
{
if (noisy)
{
printf("%s\n", s);
}
}
void trace_on() {noisy = 1;}
void trace_off() {noisy = 0;}
缺陷:
trace函数不内联,跟踪关闭时,还保持着函数调用开销,效率很低。
c版本引入了3个全局名字,trace, trace_on ,trace_off,c++版本只引入了一个
c版本很难讲这个例子一般化,使之能输出到一个以上的文件中,如果要做到这点,很明显的要再增加一个参数,或者再加一个函数,从开销调用和维护上来说相比c++版本都要颇费些精力。