-
typedef long rb_len_t -
StringやArray、MatchDataの長さや添字を表す符号付き整数型です。longですが、64 ビットの mswin (Visual C++ でビルドした 64 ビット Windows 版) ではlongが 32 ビットのままポインタが 64 ビットなので、int64_tとして定義されます。 32 ビットの mswin と MinGW 版ではlongです。 RSTRING_LEN やrb_range_beg_lenなど、長さを受け渡す C API はこの型を使います。拡張ライブラリはこれらの長さをlongではなくrb_len_tで保持してください。 64 ビットの mswin では、長さをlongで保持すると 2GiB で切り詰められ、rb_range_beg_lenなどの出力引数にlong *を渡すとコンパイルエラーになります。longが必要なときは rb_len2long で変換してください。また 64 ビットの mswin では ABI も変わるため、拡張ライブラリの再ビルドが必要です。古い版もサポートする拡張ライブラリは、HAVE_RB_LEN_T が未定義のときにtypedef long rb_len_t;などで代用できます。 extconf.rb からはRbConfig::SIZEOF["rb_len_t"]で大きさを取得できます。なお 64 ビットの mswin でも Fixnum の範囲 (FIXNUM_MAX) は 31 ビットのままなので、LEN2NUM の結果は2**30以上で Bignum になります。 [feature#22400][SEE_ALSO] rb_ulen_t, SIZEOF_RB_LEN_T, HAVE_RB_LEN_T, LEN2NUM, NUM2LEN