gpt4 book ai didi

C++ Trace Logging Question, fstream access violation 问题

转载 作者:行者123 更新时间:2023-11-28 08:21:23 26 4
gpt4 key购买 nike

这真的是两个问题,我将从最简单的开始。在这个简单的程序结束时,我得到了一个访问冲突异常。这是在 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。我想实现一个相当简单的跟踪功能,该功能仅在调试时处于事件状态。 “ Release模式”期间的任何跟踪都太慢了。

我目前的想法基本上是:

#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 模式相对应的东西?这将消除程序员手动切换它的需要(但这是一个非常小的问题)。

更详细的问题是是否有某种模板魔术方法可以执行此无宏操作。我觉得用宏开始每个函数有点像尼安德特人。

三个要点:

(1) 这个程序存放在一个DLL中。如果有两个在其他方面完全相同的功能,一个有跟踪功能,一个没有跟踪功能,那就太好了。事实上,那将是理想的。我不在乎二进制文件的大小是否是原来的两倍,只要它提高了代码的可维护性即可。

(2) “ Release模式”函数必须有一个用于跟踪记录的 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,因为这样您就可以选择在非调试构建中使用跟踪。

关于C++ Trace Logging Question, fstream access violation 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5701435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com