c++跟踪日志问题,fstream访问冲突问题

C++ Trace Logging Question, fstream access violation question

本文关键字:问题 fstream 访问冲突 c++ 日志 跟踪      更新时间:2023-10-16

这实际上是两个问题,我将从最简单的开始。在这个简单程序的末尾,我得到了一个访问冲突异常。这是在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,因为这样您可以选择在非调试构建中使用跟踪。