DelphiのEnumリフレクションの闇
Delphiでリフレクションを介してEnumの要素名を取ろうとしたら、謎のコンパイルエラーに見舞われた件、追加情報もらえたのでまとめました。
Ktz
@ktz_alias
#delphi #xe5 enumのシンボル名をRTTIで取り出そうとしたら、E2134(型情報を持っていません)エラーでコンパイル失敗しやがる。どうも0でない値から開始するとダメらしくてマジふざけんなって感じぃ stackoverflow.com/questions/1420…
2016-07-22 13:55:16
Owl's perspective
@owlsperspective
@ktz_alias これですね stackoverflow.com/questions/1420… 当時のコンパイラ担当エンジニアのBarry Kellyさんがこう書いているってことは望み薄かも?
2016-07-22 14:31:24
Owl's perspective
@owlsperspective
@ktz_alias QPにも登録されてます quality.embarcadero.com/browse/RSP-121… 一応オープンはされてますが…
2016-07-22 14:32:09
Owl's perspective
@owlsperspective
@ktz_alias はい、10.1 Berlinでも同様です。ただDelphiではビットフラグは列挙型じゃなくて集合型(set of)を使うのが一般的なので…
2016-07-22 14:57:32
スワンマン∞
@lynatan
@owlsperspective @ktz_alias docwikiで単純型のページの列挙型の項を見たら、定数が指定されてるとRTTIは生成されないとわざわざ明記されてるんで、現状はバグではなく仕様なんでしょうね
2016-07-22 16:07:00
Owl's perspective
@owlsperspective
@ktz_alias @lynatan どうもSOのBarry Kellyさんの書きっぷりだと、列挙の要素が連続してないと実装がめんどくさい、っていう話かなと。
2016-07-22 16:15:03
スワンマン∞
@lynatan
@owlsperspective @ktz_alias TEnum=(A=1,B=10)のAとBの間には無名の値が存在するという実装なので(array[TEnum] of ByteのSizeOfは10)、この開きが大きい程RTTIのサイズが爆発的に増加することに…
2016-07-22 16:30:52