C++ C++;跟踪日志记录问题,fstream访问冲突问题

C++ C++;跟踪日志记录问题,fstream访问冲突问题,c++,trace,access-violation,fstream,C++,Trace,Access Violation,Fstream,这确实是两个问题,我将从最简单的问题开始。在这个简单程序的末尾,我得到了一个访问冲突异常。这是在MSVC6中(是的,我知道…) 第二个问题是我如何尝试应用std::clog。我想实现一个相当简单的跟踪功能,它只在调试时处于活动状态。“释放模式”期间的任何跟踪都会太慢 我目前的想法基本上是: #define TRACE_LOG_TOGGLE 1 #if TRACE_LOG_TOGGLE #define TRACE_LOG(a) // something that ultimately use

这确实是两个问题,我将从最简单的问题开始。在这个简单程序的末尾,我得到了一个访问冲突异常。这是在MSVC6中(是的,我知道…)

第二个问题是我如何尝试应用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中是否存在类似于
\u DEBUG\u
的预处理器常量或与配置是调试模式还是发布模式相对应的内容?这将消除程序员手动切换的需要(但这是一个非常小的问题)

更详细的问题是,是否有某种模板神奇的方式来实现这一点。我觉得有点尼安德特人用宏启动每个函数

三个要点:

(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,因为这样您就可以选择在非调试构建中使用跟踪

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.