2011-04-18 2 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를 어떻게 적용하려고하는지입니다. 꽤 간단한 추적 기능을 구현하고 싶습니다. 디버깅 중에 만 활성화됩니다. "해제 모드"동안의 추적은 너무 느립니다.

내 현재의 생각은 기본적으로 : 구성이 디버그 또는 릴리스 모드인지에 해당 _DEBUG_이나 뭐 같은 전처리 상수가있는 경우

#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 알고 있습니까? 프로그래머가 수동으로 토글하지 않아도된다. (그러나 사소한 문제 다.)

더 자세한 질문은이 매크로를 수행하는 템플리트 마법 방법이 있는지입니다. 나는 매크로로 각각의 모든 기능을 시작하는 약간의 네안데르탈 인을 느낀다.

세 가지 중요한 사항 :

(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을 사용하는데, 디버그가 아닌 빌드에서 추적을 사용할 수있는 옵션을 가지고있다.