#include <iostream>
#include <stdarg.h>
void Print(const char* format, va_list args) { // 2번째 Print 함수에서 호출함
vprintf(format, args);
}
void Print(const char* format, ...) { // main 에서 호출함
va_list args;
va_start(args, format);
Print(format, args);
va_end(args);
}
int main()
{
char a[] = "Hello ";
char b[] = "world!";
Print("%s %s", a, b); // "Hello world!" 출력됨.
return 0;
}
위 코드는 아무 문제가 없다. 가변인자가 잘 들어가서 2번째 Print 함수 -> 1번째 Print를 호출한다.
#include <iostream>
#include <stdarg.h>
void Print(const char* format, va_list args) { // main에서 호출됨.
vprintf(format, args);
}
void Print(const char* format, ...) { // 호출되지 않음.
va_list args;
va_start(args, format);
Print(format, args);
va_end(args);
}
int main()
{
char a[] = "Hello ";
Print("%s", a); // Access violation 발생.
return 0;
}
이 코드는 Access violation을 발생시킨다.
va_list는 내부적으로 char* 이기 때문에, a가 va_list로 취급되어 1번째 Print 함수가 실행되고 Exception이 발생한다.
경우에 따라서는 CallStack이 망가져서 디버깅하기 매우 힘들어지니 꼭 절대 가변인자 함수는 오버로딩 하지말고 얌전히 함수명을 분리하자. -_-;;
'Programming > C++ & Unreal' 카테고리의 다른 글
vprintf, vsprintf 등 가변 인자 함수를 활용한 로그 함수 개발 시에 포맷 warning 출력하기 (0) | 2024.04.05 |
---|---|
StackWalk64가 context에 의하여 Access violation를 유발 (1) | 2023.10.23 |
C++ parallel for_each (thread) exception (1) | 2023.10.23 |
C++ RTTI 구현 (0) | 2021.05.02 |
Xcode tbb 설치 (0) | 2020.12.06 |