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이 망가져서 디버깅하기 매우 힘들어지니 꼭 절대 가변인자 함수는 오버로딩 하지말고 얌전히 함수명을 분리하자. -_-;;