私は次のようにつまずいたとき、私はRuby source codeを読んでいた。Cで同じトークンを持つマクロ定義は何を意味しますか?
私の知る限りRSTRING_EMBED_LEN_MAX
が以前に定義されていない言うことができるように
#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX
。 (私はRubyソースを再帰的にgreptしました)。
この行は何を正確に表していますか?
私は次のようにつまずいたとき、私はRuby source codeを読んでいた。Cで同じトークンを持つマクロ定義は何を意味しますか?
私の知る限りRSTRING_EMBED_LEN_MAX
が以前に定義されていない言うことができるように
#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX
。 (私はRubyソースを再帰的にgreptしました)。
この行は何を正確に表していますか?
この定義は、あなたが期待するように、リテラルトークンRSTRING_EMBED_LEN_MAX
に展開されます。
ソースを見ると、マクロはenum
の値を同じ名前で定義するために使用され、(int)((sizeof(VALUE)*3)/sizeof(char)-1)
に設定されています。
コミットは、mattでリンクされ、デバッグを改善するために、すべてのマクロを列挙型に変換したと説明しています。そして、マクロは互換性の理由から放置されました。
だから、 '#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX'それは私が推測しているのはむしろ無意味です。 –
しかし、RSTRING_EMBED_LEN_MAXは意味のある値(私が推測する数字)を与えられていますか? –
なぜ意味がないのなら#defineを書くのですか? –
元は '#define RSTRING_EMBED_LEN_MAX((int)(sizeof(VALUE)* 3)/ sizeof(char)-1))'でした。それが変更されたコミットを参照してください:https://github.com/ruby/ruby/commit/fd89a968372ca748910477dec8c5865e65a18565互換性の問題が残っていると思いますか? – matt
ああ私は参照してください。しかし、0に設定する方が理にかなっていませんか?私はCの達人ではないので、私はベストプラクティスを知らない。 –
@mattそれでも '(int)(sizeof(VALUE)* 3)/ sizeof(char)-1)'に設定されています。しかしそれはもはやマクロではなく、 'enum'です。マクロの評価に共通する落とし穴を防ぐために、それが 'enum'に変換されたと仮定します。 – Leandros