C 바인딩 enum

C 바인딩 enum (C Bindings enum)

C 라이브러리를 Crystal에서 쓰다 보면 C의 enum을 그대로 표현해야 할 때가 있어요. lib 안에서 enum 선언을 하면 C enum을 선언하게 됩니다.

lib X
  # In C:
  #
  #  enum SomeEnum {
  #    Zero,
  #    One,
  #    Two,
  #    Three,
  #  };
  enum SomeEnum
    Zero
    One
    Two
    Three
  end
end

C에서와 마찬가지로, enum의 첫 번째 멤버는 값 0을 갖고 그다음 값은 하나씩 증가해요.

값을 사용하려면 이렇게 해요.

X::SomeEnum::One # => One

멤버의 값을 직접 지정할 수도 있어요.

lib X
  enum SomeEnum
    Ten       = 10
    Twenty    = 10 * 2
    ThirtyTwo = 1 << 5
  end
end

보시다시피 멤버 값에는 기본적인 수학 연산이 허용돼요: +, -, *, /, &, |, <<, >> 그리고 %.

enum 멤버의 타입은 기본적으로 Int32예요. 상수 값에 다른 타입을 지정하면 오류가 납니다.

lib X
  enum SomeEnum
    A = 1_u32 # Error: enum value must be an Int32
  end
end

하지만 이 기본 타입은 바꿀 수 있어요.

lib X
  enum SomeEnum : Int8
    Zero
    Two  = 2
  end
end

X::SomeEnum::Zero # => 0_i8
X::SomeEnum::Two  # => 2_i8

enum은 fun의 매개변수나 struct·union의 멤버 타입으로 쓸 수 있어요.

lib X
  enum SomeEnum
    One
    Two
  end

  fun some_fun(value : SomeEnum)
end

출처: Crystal 공식 문서 - C bindings enum

더 알아보기 (Learn more)