2013-06-03 1 views
1

결국 printf 호출로 끝나는 일부 가변 매크로 및 함수를 사용하여 프로젝트의 로깅 시스템을 만들려고합니다. 그러나 printf는 나에게 액세스 위반 오류를 주며 왜 나는 모릅니다. 당신이 볼 수 있듯이 _DEBUG가 정의되어있는 경우, 매크로는 모든 인수를 전달 :: 로그인 로거를 호출에 해결할 수액세스 위반 Variadic 매크로/함수 C++

#ifdef _DEBUG 
#define LogError(fmt, ...) Logger::Log(LOG_ERROR,fmt,__VA_ARGS__); 
#define LogTrace(fmt, ...) Logger::Log(LOG_TRACE,fmt,__VA_ARGS__); 
#define LogWarn(fmt, ...) Logger::Log(LOG_WARN,fmt,__VA_ARGS__); 
#else 
#define LogError(fmt, ...) 
#define LogTrace(fmt, ...) 
#define LogWarn(fmt, ...) 
#endif 

:

그래서 내 매크로로 시작 할 수 있습니다. 여기

내 로거 :: 로그 함수 :

void Logger::Log(LogType type, char* fmt, ...) { 
    va_list args; 
    va_start (args, fmt); 
    std::string preFix = ""; 
    if (type==LOG_ERROR) preFix = "Error: "; 
    else if (type==LOG_WARN) preFix = "Warn: "; 
    else if (type==LOG_TRACE) preFix = "Trace: "; 
    else preFix = "Unknown: "; 

    printf(preFix.append(fmt).c_str(), args); 
    va_end(args); 
} 

그것은 형식 문자열에 로그의 유형에 따라 문자열을 앞에 수행 한 다음 액세스 다음 변수는 printf 인수의 수와 전달 위반이 발생합니다.

다음은 프로그램을 크래시하는 매크로를 사용하는 구현입니다. 매크로에 따르면

LogTrace("Adding file to asset file. Asset name: %s, File: %s", fName.c_str(), assetName.c_str()); 

:이 해결해야하는 :

Log 함수는 printf에 전달해야한다
Logger:Log(LOG_WARN,"Adding file to asset file. Asset name: %s, File: %s", <string1>, <string2>); 

. 중단 점을 사용하여 형식 문자열이 전달되고 적절히 접두사를 사용하는 것을 볼 수 있지만 변수 수를보고 디버그 할 수 없어서 Log 함수에 올바르게 전달됩니다.

매크로, 함수 및 printf에 다양한 양의 인수를 전달하려면 올바르게 수행 했습니까? 모든 것을 올바르게 수행 한 것처럼 보이면 변수 인수가 전달되는 방식을 디버그하여 어떻게 볼 수 있습니까? 도움을 주시면 감사하겠습니다.

답변

2

문제를 게시 한 직후에 문제가 발견되었습니다 ... printf는 가변 인자가 올바로 작동하기 위해 vprintf 여야합니다.