2016-05-04 12 views
1

私は次のようにつまずいたとき、私はRuby source codeを読んでいた。Cで同じトークンを持つマクロ定義は何を意味しますか?

私の知る限り RSTRING_EMBED_LEN_MAXが以前に定義されていない言うことができるように
#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX 

context

。 (私はRubyソースを再帰的にgreptしました)。

この行は何を正確に表していますか?

+1

元は '#define RSTRING_EMBED_LEN_MAX((int)(sizeof(VALUE)* 3)/ sizeof(char)-1))'でした。それが変更されたコミットを参照してください:https://github.com/ruby/ruby/commit/fd89a968372ca748910477dec8c5865e65a18565互換性の問題が残っていると思いますか? – matt

+0

ああ私は参照してください。しかし、0に設定する方が理にかなっていませんか?私はCの達人ではないので、私はベストプラクティスを知らない。 –

+0

@mattそれでも '(int)(sizeof(VALUE)* 3)/ sizeof(char)-1)'に設定されています。しかしそれはもはやマクロではなく、 'enum'です。マクロの評価に共通する落とし穴を防ぐために、それが 'enum'に変換されたと仮定します。 – Leandros

答えて

4

この定義は、あなたが期待するように、リテラルトークンRSTRING_EMBED_LEN_MAXに展開されます。

ソースを見ると、マクロはenumの値を同じ名前で定義するために使用され、(int)((sizeof(VALUE)*3)/sizeof(char)-1)に設定されています。

コミットは、mattでリンクされ、デバッグを改善するために、すべてのマクロを列挙型に変換したと説明しています。そして、マクロは互換性の理由から放置されました。

+0

だから、 '#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX'それは私が推測しているのはむしろ無意味です。 –

+0

しかし、RSTRING_EMBED_LEN_MAXは意味のある値(私が推測する数字)を与えられていますか? –

+0

なぜ意味がないのなら#defineを書くのですか? –

関連する問題