C언어 가변길이 배열 파라미터로 입력받기

가변 인자 함수

원문 제목은 가변길이 배열을 다루지만, 예제의 핵심은 ...를 사용하는 가변 인자 함수다. 인자 개수나 타입이 호출 시점에 달라질 수 있을 때 stdarg.h의 도구를 사용한다.




  • va_list는 가변 인자를 순회하는 상태를 보관한다.
  • va_start는 마지막 고정 인자 뒤에서 가변 인자 읽기를 시작한다.
  • va_arg는 지정한 타입으로 다음 인자를 읽는다.
  • va_end는 사용을 마친 뒤 정리한다.




#include <stdarg.h>
#include <stdint.h>

void copy_bytes(uint8_t *dst, size_t count, ...) {
  va_list args;
  va_start(args, count);
  for (size_t index = 0; index < count; index += 1) {
    dst[index] = (uint8_t)va_arg(args, int);
  }
  va_end(args);
}




가변 인자에는 타입 정보가 남지 않는다. uint8_t 같은 작은 정수형은 기본 인자 승격 때문에 int로 읽어야 한다. 형식이 맞지 않으면 정의되지 않은 동작이 발생한다.




배열을 전달하는 목적이라면 포인터와 길이를 인자로 받는 함수가 더 명확하고 안전하다. 가변 인자는 printf처럼 형식 규칙이 분명한 API에 제한해서 사용하는 편이 낫다.

Comments

댓글을 불러오고 있습니다.