Taking baby-developer steps

22.02.07. printf()관련 공부 - stdarg.h/ va_start, va_arg, va_copy, va_end 본문

Logs/학습 log

22.02.07. printf()관련 공부 - stdarg.h/ va_start, va_arg, va_copy, va_end

Surin Lee 2022. 2. 7. 22:48

오늘 목표

  • 가변함수 관련 헤더(stdarg.h)내 함수 공부
    • va_start
    • va_arg
    • va_copy
    • va_end

오늘 한 일

가변함수 관련 헤더(stdarg.h)내 함수 공부

references:

https://www.ibm.com/docs/ko/i/7.4?topic=lf-va-arg-va-copy-va-end-va-start-handle-variable-argument-list /

va_arg() – va_copy() – va_end() – va_start() — 가변 인수 리스트 처리

https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/va-arg-va-copy-va-end-va-start?view=msvc-170 / va_arg, va_copy, va_end, va_start

 

  • va_list

-> 함수는 아니지만, 길이가 변할 수 있는 인자(파라미터)들을 저장하려면 가변의 저장 공간이 필요하고, 각 가변 인자의 시작 주소를 가리킬 포인터로 va_list 자료형을 사용한다. 이 자료형은 내부적으로 char *로 정의되어 있다.

 

  • 나머지 함수들

나머지 start, arg, copy, end 각각의 함수를 보면서, 뭔가 리스트를 구현할 때 구현한 함수들이나 각각의 노드에 접근하던 방식과 비슷하다는 느낌을 받았다.

va_start는 va_list로 만들어진 포인터에게 가변인자 중 펏번째 인자의 주소를 가르쳐준다. arg, copy, end에 대한 후속 호출에 대해서 arg_ptr 포인터를 초기화 하는 과정이다.

 

va_arg()함수는 다른 start, copy, end함수와는 달리 유일하게 반환값이 존재한다. arg함수는 특정 가변인자를 가리키고 있는 va_list의 포인터를 다음 가변인자로 이동시킨다.

 

va_copy()

제일 설명이 난해하게 느껴져서 이해가 잘 가지 않는 함수 였는데, IBM 페이지에 있던 각 함수의 활용 예시를 보고 나서 좀 감을 잡았다. dest로 들어온 주소(va_list *)에 src에 들어오는 va_list를 첫 주소로 하는 가변인수 목록(list)를 복사 하는것이다. 

해당 함수가 호출되었을 때 일어나는 좀더 자세한 사항들은 직접 테스트 해보면서 알아봐야겠다.

 

va_end()

사용한 가변인자 변수를 끝낼 때 사용하는 함수이다. arg_ptr에 널포인터를 넣어주는 함수인데, 단순하지만 프로그램상 어떠한 경우에도 문제가 생기지 않도록 꼭 써줘야한다.


메모

보통 공부할 땐 노션에 정리를 하는 편이라,

블로그에 올라오는 내용은 노션의 짧은 요약본 정도이다. 

Comments