簡體   English   中英

C ++跟蹤記錄問題,fstream訪問沖突問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM