2015. 3. 31. 03:36ㆍ프로그래밍/C/C++
1. 가변인자란?
인자의 개수가 변한다는 뜻을 의미한다.
같은 함수명이어도 파라미터를 2개, 3개 쓸 수 있다.
2. 자주 사용하는 printf의 원형
_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);
내부적으로 __cdecl 호출규약을 사용하고 있다.
... 부분이 가변 인자, 가변 파라미터를 의미한다.
3. 가변인자를 사용하려면?
필요 헤더 - stdarg.h
조건 - 최소 1개 이상의 고정 인수가 필요하다. ... 파라미터는 순서 상 가장 마지막에 있어야 한다.
가변인자 함수에서 사용되는 변수들을 알아야한다.
va_list - char*로 정의되어 있으며 각 인자의 시작 주소를 가리킨다.
va_start - va_list로 만들어진 포인터에게 가변인자 중 첫 번째 인자의 주소를 가르쳐준다.
내부 매크로 -
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
_ADDRESSOF - 주소로 바꿔준다.
_INTSIZEOF - 고정인수의 size를 구하고 가변인자의 시작주소까지의 메모리상의 거리를 구해준다.
va_arg - va_list의 포인터를 다음 가변인자로 이동시켜준다.
내부 매크로 -
#define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
va_end - 가변인자 사용을 마친다.
내부 매크로 -
#define _crt_va_end(ap) ( ap = (va_list)0 )
NULL 포인터를 돌려주는 매크로.
4. 예제
더하기 함수 sum을 구현한다. 고정 인수는 개수로 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <stdarg.h> int sum(int count, ...) { int result = 0; va_list ap; int i; va_start(ap, count); for(i=0; i<count; i++) { result += va_arg(ap, int); } va_end(ap); return result; } int main() { printf("%d\n", sum(2,1,2)); printf("%d\n", sum(5,1,2,3,4,5)); return 0; } | cs |
'프로그래밍 > C/C++' 카테고리의 다른 글
[C++] 가상 함수 테이블 (0) | 2015.04.01 |
---|---|
RTTI , 캐스팅 (0) | 2015.03.31 |
오버라이딩(Overriding) (0) | 2015.03.31 |
friend (0) | 2015.03.30 |
__forceinline, __inline, inline 함수 조사 (0) | 2015.03.29 |
Stroustrup Empty class에 대한 내용 읽어보기 (1) | 2015.03.25 |
[c++] main함수의 인자 argc, argv (0) | 2015.03.07 |