결국 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에 다양한 양의 인수를 전달하려면 올바르게 수행 했습니까? 모든 것을 올바르게 수행 한 것처럼 보이면 변수 인수가 전달되는 방식을 디버그하여 어떻게 볼 수 있습니까? 도움을 주시면 감사하겠습니다.