繁体   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