[英]C++ Trace Logging Question, fstream access violation question
這實際上是兩個問題,我將從最簡單的問題開始。 在這個簡單程序的結尾,我遇到了訪問沖突異常。 這在MSVC6中(是的,我知道...)。
int main()
{
std::fstream logFile("clog.txt");
std::clog.rdbuf( logFile.rdbuf() );
// ... use clog ...
logFile.close(); // I've tried removing this, same problem.
return 0;
}
第二個問題是如何嘗試應用std :: clog。 我想實現一個相當簡單的跟蹤功能,該功能僅在調試時處於活動狀態。 “發布模式”期間的任何跟蹤都將太慢。
我目前的想法基本上是:
#define TRACE_LOG_TOGGLE 1
#if TRACE_LOG_TOGGLE
#define TRACE_LOG(a) // something that ultimately uses std::clog
#else
#define TRACE_LOG(a) // empty.
#endif
首先,有人在MSVC6中知道是否有一個預處理器常量,如_DEBUG_
或與配置是“調試”模式還是“釋放”模式相對應的東西? 這樣就不需要程序員手動切換它了(但這是一個很小的問題)。
更詳細的問題是,是否有某種模板魔術來完成此宏。 我感覺每個地方都需要一個宏來開始一些穴居。
三個要點:
(1)該程序存儲在DLL中。 具有兩個其他相同的功能,一個具有跟蹤功能,另一個不具有跟蹤功能,將是完美的選擇。 實際上那是理想的。 我不在乎二進制文件的大小是否是其兩倍,只要它可以提高代碼的可維護性即可。
(2)“釋放模式”功能必須具有用於跟蹤記錄的NOOP。
(3)但是,我不想使每個函數都具有帶有跟蹤日志記錄參數的模板函數。
與往常一樣,非常感謝大家。
對於第一個問題,您可能想要還原原始緩沖區。 就像是:
std::fstream logFile("clog.txt");
streambuf * old = std::clog.rdbuf( logFile.rdbuf() );
// ... use clog ...
std::clog.rdbuf( old );
logFile.close(); // I've tried removing this, same problem.
或者,最好創建一個RAII類來處理它。
對於跟蹤,宏是必經之路。 我會堅持使用自己的#define,因為這樣,您可以選擇在非調試版本中使用跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.