2011-04-18 96 views
0

这确实是两个问题,我将从最简单的开始。在这个简单的程序结束时,我得到一个访问冲突异常。这是在MSVC6(是的,我知道...)。C++跟踪记录问题,fstream访问冲突问题

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)但我不想让每个函数都具有跟踪记录参数的模板函数。

一如既往,多谢先生们。

回答

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,因为你可以选择在非调试版本中使用跟踪。