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: 초기화하지 않은 변수 선언