假設我們在20個模塊中有一個30 K行代碼數據庫:每個文件對應每個* .cpp和* .h文件。在開發過程中,源代碼用局部變量裝飾,通過cerr查找。有時它有與gdb相同的優點,有時不會。 你想保持cerr流清潔/沉默,並且只能從他希望的模塊中讀取到cerr的寫入。我如何:C++根據模塊名選擇性地打印cerr流
1)區分寫入cerr,他們包含他們從哪個模塊來的信息? 2)爲構建二進制文件添加cmd行選項,該選項將指定允許哪些模塊寫入cerr(我想看到的那些模塊)。
假設我們在20個模塊中有一個30 K行代碼數據庫:每個文件對應每個* .cpp和* .h文件。在開發過程中,源代碼用局部變量裝飾,通過cerr查找。有時它有與gdb相同的優點,有時不會。 你想保持cerr流清潔/沉默,並且只能從他希望的模塊中讀取到cerr的寫入。我如何:C++根據模塊名選擇性地打印cerr流
1)區分寫入cerr,他們包含他們從哪個模塊來的信息? 2)爲構建二進制文件添加cmd行選項,該選項將指定允許哪些模塊寫入cerr(我想看到的那些模塊)。
編輯:事實上,最好的方法是使用日誌框架(按照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
}
嗯,要多問:DI會詢問是否http://logging.apache.org/log4cxx/可以幫助它在運行時請求登錄指定的編譯單元我知道有格式化選項,它有文件名,但我會必須重新調整輸出,降低性能並執行大量非本地登錄請求。事情是我在丹尼斯的片段或更大的框架之間猶豫。似乎我想要的功能必須由myslef實現,無論我選擇什麼解決方案。 – paul424
這取決於你長期以來想要做什麼。投資於日誌框架將幫助您瞭解它,並將使項目在未來的日誌記錄更改方面更加靈活。但是,如果你想要一個快速簡單的方法來記錄文件名(你也可以使用__FUNCTION__),那麼上面的內容可能就是你想要的。由你決定。 – Dennis
我建議你開始尋找一些日誌框架,而不是建立你自己的。最常見的似乎是log4cxx,log4cpp和log4cplus。使用Google查找它們並檢查哪個最適合您。 –