728x90
가변 파라미터는 함수가 정해지지 않은 수의 인자를 받을 수 있도록 해주는 기능입니다.
C++에서는 주로 두 가지 방법을 사용하여 가변 파라미터를 구현할 수 있습니다.
- C 스타일의 'stdarg.h' 헤더를 사용하는 방법
- C++11 이후에 도입된 'initializer_list'와 가변 템플릿을 활용하는 방법
이 글에서는 이 두 방법을 소개하고 각각의 장단점을 비교해 보겠습니다.
C 스타일 가변 파라미터 ('stdarg.h')
가변 파라미터를 처리하는 전통적인 C 방식은 'stdarg.h' 헤더 파일을 포함하여
'va_list', 'va_start', 'va_arg', 'va_end' 매크로를 사용하는 것입니다.
이 방법은 C와의 호환성이 필요한 경우나 매우 낮은 수준에서의 컨트롤이 필요할 때 유용합니다.
예제 코드
#include <iostream>
#include <cstdarg>
void printNumbers(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
int num = va_arg(args, int);
std::cout << num << " ";
}
va_end(args);
std::cout << std::endl;
}
int main() {
printNumbers(5, 1, 2, 3, 4, 5);
return 0;
}
#include <iostream>
#include <cstdarg>
#include <cstring>
void printStrings(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
const char* str = va_arg(args, const char*);
std::cout << str;
}
va_end(args);
std::cout << std::endl;
}
int main() {
printStrings(5, "Hello", ", ", "world", "! ", "This is C-style programming.");
return 0;
}
- 장점
- C와의 호환성 유지
- 모든 타입의 데이터를 처리할 수 있음
- 단점
- 타입 안전성이 보장되지 않음
- 사용하기 복잡하고 오류가 발생하기 쉬움
C++11 가변 템플릿 ('initializer_list'와 템플릿)
C++11에서는 가변 매개변수 템플릿을 도입하여 타입 안전성과 사용의 편리성을 크게 개선했습니다.
'initializer_list'를 사용하거나 템플릿 가변 인자를 활용하여 함수를 정의할 수 있습니다.
예제 코드 ('initializer_list' 사용)
#include <iostream>
#include <initializer_list>
void printNumbers(std::initializer_list<int> ilist) {
for (auto num : ilist) {
std::cout << num << " ";
}
std::cout << std::endl;
}
int main() {
printNumbers({1, 2, 3, 4, 5});
return 0;
}
예제 코드 (가변 템플릿 사용)
#include <iostream>
template<typename... Args>
void printNumbers(Args... args) {
(std::cout << ... << args) << std::endl;
}
int main() {
printNumbers(1, 2, 3, 4, 5);
return 0;
}
- 장점
- 타입 안전성 보장
- 사용이 간편하고 읽기 쉬움
- 다양한 타입의 인자를 한 번에 처리할 수 있음
- 단점
- 오직 C++11 이상에서만 사용 가능
- 특정 상황에서 컴파일러에 따라 성능 차이가 발생할 수 있음
마무리
C++에서 가변 매개변수를 사용하는 방법은 상황과 요구 사항에 따라 다르게 선택할 수 있습니다.
'stdarg.h'는 레거시 코드와의 호환성이나 특정 저수준 작업에 적합할 수 있지만,
C++11 이상의 가변 템플릿은 보다 안전하고 현대적인 접근 방식을 제공합니다.
프로젝트의 요구 사항과 팀의 선호도에 따라 적절한 방법을 선택하시기 바랍니다.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
728x90
반응형
'Application > 기초' 카테고리의 다른 글
[기초] C++ 멀티스레딩 (Thread) (0) | 2024.04.29 |
---|---|
[기초] C++ 템플릿 (Templates) (2) | 2024.04.28 |
[기초] C++ 디폴트 파라미터 (Default Parameters) (0) | 2024.04.26 |
[기초] C++ 메모리 패킹 (pragma pack) (0) | 2024.04.25 |
[기초] C++ 유니언과 비트필드 (UNION & BitField) (0) | 2024.04.24 |