ft_printf

이민규·2023년 6월 7일
1

42seoul

목록 보기
4/24

들어가기전 알고가면 좋은 정보


가변인자란 ?

우리가 일반적으로 사용하는 함수들은 보통 인자가 정해져서 들어오게된다
ex.) putchar(char c), putstr(char *s)
그러나 printf 함수를 사용했던 기억을 떠올려보면 사용하고 싶은 만큼 인자를 넣고 사용 했음을 알 수 있다
ex.) printf("1개 %d 2개 %s 3개 %x", 1, "second", 3)
이런식으로 인자가 몇개 들어올지 알 수 없을때 사용할 수 있는것이 바로 가변인자이다

가변인자의 사용법

그렇다면 가변인자는 어떻게 사용할 수 있을까 먼저 printf의 원형을 보면서 알아보자
int printf(const char *format, ...) printf함수를 보았을때 이상한점이 보일 것이다 ... 부분인데 가변인자는 이처럼 점 3개를 이용하여서 표현할 수 있다 단 주의해야할점이 있는데 가변인자를 사용할 때는 최소 한개이상 가변인자가 아닌 인자가 있어야된다는 점이다 그 이유는 뒷부분에 stdarg.h 내용을 설명할 때 알게되겠지만 가변인자를 사용할때 맨 마지막 인자의 다음 주소부터 접근을하는데 가변인자만 있어면 시작 주소를 어떻게 설정할지 모르게 되기 때문에 가변인자가 아닌 인자가 최소 한개이상 있어야 되는것이다.


stdarg.h


stdarg.h란

가변인자를 사용할때 편리하게 쓸수있게 여러가지 기능들을 매크로함수로 정의해놓은 함수이다 va_arg, va_start, va_end, va_arg 등 가변인자를 사용할 때 편리한 기능들이 많이 들어가져있다

va_list

va_list ap

va_list는 가변인자 목록을 의미하며 가변인자의 주소를 담을 수 있는 포인터 변수이다 관습적으로 ap라는 이름을 사용하며 va_list 타입은 typedef를 통해 내부적으로 char *로 정의되어져 있다

va_start

va_start(ap, 가변인자를 제외한 마지막 인자)

va_start는 va_list를 초기화해주는 매크로이다 va_start를 통해 첫 번째 가변인자의 주소를 ap가 참조 할 수 있도록 만들어준다 정의되어져 있는 형태는 Microsoft Visual Studio 기준으로 아래와 같다

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

va_start함수는 v에다가 가변인자가 아닌 마지막 인자를 넣어주면 마지막인자의 시작주소에서 마지막인자의 크기만큼을 이동하여 가변인자의 첫 시작주소를 ap에 할당해 준다
👀 그렇기 때문에 가변인자를 사용할 때 는 최소 한개 이상 가변인자가 아닌 인자가 존재해야 가변인자를 사용할 수 있다.

va_arg

자료형에 맞는 변수 = va_arg(ap, 자료형)

va_arg는 va_list를 자료형만큼 이동시켜서 다음 자료를 가르키게 만들어주고 현재 자료형의 시작 주소를 리턴시켜서 자료형에 맞는 변수에 값을 넣어주게 된다

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

👀 이때 char, short의 경우에는 int형으로 써야하고 float의 경우에는 double로 사용 후 형변환을 시켜주어야 한다

char c = (char)va_arg(ap, int);

그 이유는 컴퓨터가 메모리에 데이터를 저장할때 4바이트씩 끊어서 저장하는 것이 동작할때 더 빨리 동작하기 때문이다
참고하면 좋은글 : 바이트패딩이란

va_end

va_end(ap);

va_end 매크로함수는 va_list타입의 포인터 변수에 NULL값을 할당하여 사용을 끝낼 때 사용된다

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

va_copy

va_copy(va_list dest, va_list src);

va_copy함수는 현재 위치를 저장해야 하는 경우 사용된다 포인터가 계속 전진하고 있는 경우에서 해당 위치를 저장해야 할 경우가 생기면 va_copy를 이용하여 해당 위치를 저장해둔다
참조 사이트 : 팔만코딩경 ft_printf

profile
프로그래머 희망자(휴직중)

1개의 댓글

comment-user-thumbnail
2023년 6월 7일

잘 보고 갑니다

답글 달기