C++中使用宏定义来注释掉所有的cout输出

144 篇文章 6 订阅

对于大一点的程序,为了验证正确性,除了看直接的效果外,里面还会增加一系列的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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值