C언어

C언어 <가변인자>

um_coding 2023. 8. 5. 12:15

가변인자

printf()함수에는 인자를 1개만 넣어도 되고, 2개만 넣어도 되고, 3개, 4개 그 이상을 넣어도 문제없이 돌아간다.

printf의 원형(컴파일러에 따라 printf의 실제 구형과는 원형이 다를 수 있다.)

printf함수의 두 번째 인자로 사용되는 ...이 가변인자 혹은 가변파라미터라고 불리는 것이다.

printf를 쓸 때, 인자(파라미터)로 아무것도 넘겨주지 않을 수도 있고, 혹은 여러 개의 인자를 넘겨줄 수 있다.

가변인자를 이용해서 모든 파라미터를 더해주는 sum()함수를 만든 것이다.

가변인자에 필요한 것들

va_list

각 가변인자의 시작 주소를 가리킬 포인터

내부적으로는 char*로 정의되어 있다.

 

va_start

va_list로 만들어진 포인터에게 가변인자 중 첫 번째 인자의 주소를 가르쳐주는 중요한 메크로이다.

(Microsoft Visual Studio 기준) 실제로 이렇게 생겼다.

#define va_start(ap, v)((ap)=(va_list)_ADDRESSOF(v)+_INTSIZEOF(v))

ap: va_list(ap, v)로 만든 포인터

v: 마지막 고정인수가 담긴다.

_ADDRESSOF(v) => &(v), 즉 주소로 바꿔주는 메크로

 

va_arg

특정 가변인자를 가리키고 있는 va_list의 포인터를 다음 가변인자로 이동시켜 주는 메크로

#define va_arg(ap,t)(*(t*)((ap+=_INTSIZEOF(t))-_INTSIZEOF(t)))

t: int, long, double과 같은 타입 이름이 담긴다.

 

va_end

사용한 가변인자를 변수를 끝낼 때 사용

단순히 모양을 보면 NULL포인터로 돌려주는 메크로인테 프로그램상 어떤 경우가 생길지 모르니깐 놓치지 말고 써줘야 한다.

#define va_end(ap)(ap=(va_list)0)

'C언어' 카테고리의 다른 글

C언어 <공용체>  (0) 2023.08.05
C언어 <구조체>  (0) 2023.08.05
C언어 <전치행렬>  (0) 2023.08.05
C언어 <문자열> <함수 포인터>  (0) 2023.07.26
C언어 <포인터>  (0) 2023.07.25