这真的是两个问题,我将从最简单的开始。我在这个简单的程序结束时遇到访问冲突异常。这是在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_
的预处理器常量或与配置是Debug还是Release模式相对应的内容?这将消除程序员手动切换的需要(但这是一个非常小的问题)。
更详细的问题是,是否存在某种模板魔术方式来执行此sans宏。我感觉有点尼安德特人用宏开始每一个功能。
三个要点:
(1)该程序存储在DLL中。如果有两个相同的函数,一个有跟踪,一个没有,完全没问题。事实上,这将是理想的。我不关心二进制文件是否是两倍大小,只要它提高了代码的可维护性。
(2)“释放模式”功能必须有一个NOOP用于跟踪记录。
(3)但是我不希望每个函数都使用trace logging参数作为模板函数。
一如既往,非常感谢你们。
答案 0 :(得分:1)
对于第一个问题,您可能希望恢复原始缓冲区。类似的东西:
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,因为你可以选择在非调试版本中使用跟踪。