对于大一点的程序,为了验证正确性,除了看直接的效果外,里面还会增加一系列的cout输出。在调试过程中,也会增加一系列的输出,但是当程序量大的时候,这些输出的清楚将会变成很麻烦的事情。如何通过宏定义依次注释掉所有的输出呢?本文给了尝试。
直接上代码:
#include <iostream>
#define TRACE
#ifndef TRACE
#define tcout 0 && cout//或者NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
tcout<<"abdsa"<<endl;
return 0;
}
#include <iostream>
//#define TRACE
#ifndef TRACE
#define tcout 0 && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
tcout<<"abdsa"<<endl;
return 0;
}
简单吧。知其然而知其所以然,为啥呀?咱把tcout打出来,
#include <iostream>
//#define TRACE
#ifndef TRACE
#define tcout 0 && cout //或者NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
printf("%p\n",tcout);
tcout<<"abdsa"<<endl;
return 0;
}
发现0 &&cout计算后为nil。
#include <iostream>
#define TRACE
#ifndef TRACE
#define tcout NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
//printf("%p\n",tcout);
0 && tcout<<"abdsa"<<endl;
return 0;
}
可以看到我们把0 &&挪到输出前面,效果是一样的,这说明cout其实并不是没有被调用,只不过是执行完之后没有输出到console上来,因为把输出到console缓冲区的内容和0或者NULL作了&&操作,才不输出的。
但是这个是不是有开销,我就不清楚了。如果有开销,那么这种并不是真正的解决方案,如果没有开销,或者说并没有尝试去将内容写向console,那就可以作为解决方案。
我们再测试一下具体的时间:
(1)打印数据出来:耗时155ms左右
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
#define TRACE
#ifndef TRACE
#define tcout NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
struct timeval timeStart,timeEnd;
gettimeofday(&timeStart, NULL );
long runTime = timeStart.tv_sec*1000000 +timeStart.tv_usec;
//printf("%p\n",tcout);
for(int i=0;i<100000;i++)
{
//0 && tcout<<"abdsa"<<endl;
tcout<<"abdsa"<<endl;
}
gettimeofday(&timeEnd, NULL );
runTime = timeEnd.tv_sec*1000000 +timeEnd.tv_usec - runTime;
printf("time consume: %ld\n",runTime);
return 0;
}
(2)使用0 && cout,耗时721us
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
#define TRACE
#ifndef TRACE
#define tcout NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
struct timeval timeStart,timeEnd;
gettimeofday(&timeStart, NULL );
long runTime = timeStart.tv_sec*1000000 +timeStart.tv_usec;
//printf("%p\n",tcout);
for(int i=0;i<100000;i++)
{
0 && tcout<<"abdsa"<<endl;
//tcout<<"abdsa"<<endl;
}
gettimeofday(&timeEnd, NULL );
runTime = timeEnd.tv_sec*1000000 +timeEnd.tv_usec - runTime;
printf("time consume: %ld\n",runTime);
return 0;
}
(3)测试不打印任何输出的情况下的耗时:737us
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
#define TRACE
#ifndef TRACE
#define tcout NULL && cout
#else
#define tcout cout
#endif
using namespace std;
int main(){
struct timeval timeStart,timeEnd;
gettimeofday(&timeStart, NULL );
long runTime = timeStart.tv_sec*1000000 +timeStart.tv_usec;
//printf("%p\n",tcout);
for(int i=0;i<100000;i++)
{
//0 && tcout<<"abdsa"<<endl;
//tcout<<"abdsa"<<endl;
}
gettimeofday(&timeEnd, NULL );
runTime = timeEnd.tv_sec*1000000 +timeEnd.tv_usec - runTime;
printf("time consume: %ld\n",runTime);
return 0;
}
这说明,上述方法是一个可使用的解决方案,不会降低程序的性能。
如果要控制日志的输出,就用:
#ifndef TRACE
#define tcout 0 && Loger::instance()::log
#else
#define tcout Loger::instance()::log
#endif