C++中使用巨集定義來註釋掉所有的cout輸出
對於大一點的程式,為了驗證正確性,除了看直接的效果外,裡面還會增加一系列的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
相關文章
- C++ cout列印輸出 (解決輸出亂碼)C++
- C++中巨集定義#define的用法C++
- C++輸入輸出常用格式(cin,cout,stringstream)C++
- C++輸出流cout的執行順序問題C++
- C++ | VS2017 C++專案配置使用的常見巨集定義C++
- 巨集定義
- C語言巨集定義中#define中的井號#的使用C語言
- 0x03. 使用巨集定義事件事件
- 【C進階】21、巨集定義與使用分析
- std::cout 輸出 unsigned char型別資料型別
- 記憶體對齊巨集定義的簡明解釋記憶體
- iOS標頭檔案中如何在巨集裡引用已有的巨集iOS
- libev中ev_loop結構體中巨集定義的理解OOP結構體
- 巨集定義跟多個引數
- Visual C++ MFC 中常用巨集的含義C++
- C++(std::cout 處理 char*)C++
- 【C++】輸入輸出C++
- C語言中的標頭檔案中的巨集定義C語言
- iOS-日常開發常用巨集定義iOS
- C++ 定義靜態成員 static 關鍵字不能在定義出重複出現C++
- IDEA自定義註釋Idea
- latex 如何輸出反斜槓、加單行註釋
- [C++] cin, cout, clog, cerr中的c是什麼意思C++
- IDEA自定義類註釋和方法註釋(自定義groovyScript方法實現多行引數註釋)Idea
- 如何在Eclipse中如何自動新增註釋和自定義註釋風格Eclipse
- c 語言中巨集定義和定義全域性變數的區別變數
- IDEA中如何設定檔案頭註釋和方法註釋(詳解)Idea
- html檔案中的php程式碼被註釋掉的問題HTMLPHP
- IDEA自定義註釋模板Idea
- VARCHART XGantt系列教程:使用顏色來定義語義
- C語言學習第18篇---巨集定義與使用 / 條件編譯使用分析C語言編譯
- Eclipse中設定作者日期等Java註釋模板EclipseJava
- C++ 前置定義 Forward declarationC++Forward
- 關於malloc原始碼中的bin_at巨集定義的個人見解原始碼
- Python怎麼輸出所有的水仙花數?Python
- public @interface xxx 定義註解
- 巨集定義裡面為什麼要加括號?
- gcc編譯階段列印巨集定義的內容GC編譯