가변인자

2015. 3. 31. 03:36프로그래밍/C/C++

728x90
728x90

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



728x90
반응형

'프로그래밍 > 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