2012-06-18 20 views
0

假設我們在20個模塊中有一個30 K行代碼數據庫:每個文件對應每個* .cpp和* .h文件。在開發過程中,源代碼用局部變量裝飾,通過cerr查找。有時它有與gdb相同的優點,有時不會。 你想保持cerr流清潔/沉默,並且只能從他希望的模塊中讀取到cerr的寫入。我如何:C++根據模塊名選擇性地打印cerr流

1)區分寫入cerr,他們包含他們從哪個模塊來的信息? 2)爲構建二進制文件添加cmd行選項,該選項將指定允許哪些模塊寫入cerr(我想看到的那些模塊)。

+4

我建議你開始尋找一些日誌框架,而不是建立你自己的。最常見的似乎是log4cxx,log4cpp和log4cplus。使用Google查找它們並檢查哪個最適合您。 –

回答

1

編輯:事實上,最好的方法是使用日誌框架(按照Joachim Pileborg的評論)。如果你絕對必須堅持你已經擁有的代碼,但是想要將它整合起來,下面的內容才真正適用。

執行此操作的最佳方法是使用預處理器,使用#ifdef指令來選擇要構建的代碼。

例如

#ifdef CERR_DEBUG_BUILD_MODULE_1 
cout << __FILE__ << ":" << __LINE__ << "\tCERR DEBUG OUTPUT" << endl; 
#endif 

這種說法可能是更好的包裹在一個小宏:

#ifdef CERR_DEBUG_BUILD_MODULE_1 
#define LOG(x) cerrLogPrint(x, __FILE__, __LINE__) 
#else 
#define LOG(x) 
#endif 

其中

void cerrLogPrint(const char* const log, const char* filename, unsigned int line) 
{ 
    //PRINT 
} 
+0

嗯,要多問:DI會詢問是否http://logging.apache.org/log4cxx/可以幫助它在運行時請求登錄指定的編譯單元我知道有格式化選項,它有文件名,但我會必須重新調整輸出,降低性能並執行大量非本地登錄請求。事情是我在丹尼斯的片段或更大的框架之間猶豫。似乎我想要的功能必須由myslef實現,無論我選擇什麼解決方案。 – paul424

+0

這取決於你長期以來想要做什麼。投資於日誌框架將幫助您瞭解它,並將使項目在未來的日誌記錄更改方面更加靈活。但是,如果你想要一個快速簡單的方法來記錄文件名(你也可以使用__FUNCTION__),那麼上面的內容可能就是你想要的。由你決定。 – Dennis