Programming/C++ & Unreal
C++ 가변인자(va_list)를 오버로딩 하지 말자.
장형이
2023. 10. 23. 03:59
#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이 망가져서 디버깅하기 매우 힘들어지니 꼭 절대 가변인자 함수는 오버로딩 하지말고 얌전히 함수명을 분리하자. -_-;;