out 매개변수

out 매개변수

C 바인딩에서 함수의 출력값을 담을 때 자주 쓰이는 패턴이에요. 예를 들어 waitpid 함수를 살펴볼게요.

lib C
  fun waitpid(pid : Int32, status_ptr : Int32*, options : Int32) : Int32
end

이 함수의 문서에는 이렇게 적혀 있어요.

자식 프로세스의 상태 정보는 status_ptr이 가리키는 객체에 저장된다. 단, status_ptr이 null 포인터인 경우는 예외다.

보통은 이렇게 포인터를 직접 만들어 넘겨 주는 방식으로 쓸 수 있어요.

status_ptr = uninitialized Int32

C.waitpid(pid, pointerof(status_ptr), options)

status_ptr의 포인터를 함수에 넘겨서 함수가 그 값을 채워 주도록 하는 거예요.

출처: Crystal 공식 문서

본문

위 코드를 out 매개변수를 사용하면 더 간단하게 쓸 수 있어요.

C.waitpid(pid, out status_ptr, options)

이렇게 하면 컴파일러가 Int32 타입의 status_ptr 변수를 자동으로 선언해 줘요. 매개변수 타입이 Int32*이기 때문이죠.

이 방식은 타입이 포인터인 모든 fun 매개변수에 적용할 수 있어요. 물론 그 함수가 포인터가 가리키는 값을 실제로 채워 주는 함수여야 해요.

더 알아보기

  • C 바인딩: lib 선언과 fun 매개변수
  • pointerof: 변수의 주소를 포인터로 얻는 표현식
  • uninitialized: 초기화하지 않은 변수 선언