- ベストアンサー
__xとか¥記号とか宣言していないものも多く、皆目見当がつきません。
- `ast_test_flag`関数は、ソースコード中の`flags`フィールドの特定のフラグがセットされているかどうかをチェックするために使用されます。
- この関数の内部では、`flags`フィールドの値を一時変数`__p`に保存し、`__x`というダミー変数を使用して`__p`と`__x`の型が一致しているかどうかをチェックします。
- その後、`(p)->flags`と`flag`の論理積を計算し、特定のフラグがセットされているかどうかを判定します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
p->flags は恐らく複数のフラグを保持するビット列です。 パラメータ flag は、ビット列からフラグを抽出するためのビットマスクでしょう。 2~4行目は置いておいて、 5行目のビット演算、p->flags と flag の AND が、 最終的にこのマクロ全体の結果値となります。 すなわち p->flags に flag で指定したビットが 立っているか否かを返すためのコードであると考えられます。 2~4行目ですが、 p->flags と同じ型のコピー __p を用意し、 次に __unsigned_int_flags_dummy と同じ型の __x を用意します。 これらのアドレスを比較し、その結果を捨てています。 p->flags が __unsigned_int_flags_dummy と同じ型で定義されているかを コンパイル時にチェックするためのコードだと思われます。 p->flags が __unsigned_int_flags_dummy と異なる型を持つ場合、 コンパイル時に「型が違うポインタの比較」に関するエラーが出ます。 同じ型であれば、無意味なコードとなります。 (コンパイラの最適化により無視される可能性が高いです)。 何らかの理由で p->flags が想定外の型で定義されているケースを コンパイル時に検出する必要があるのでしょう。 typeof は GCC Extension です。
その他の回答 (4)
- wormhole
- ベストアンサー率28% (1626/5665)
>・(p)->flagsとはなんでしょうか?どこでも宣言してない マクロなので、そこだけ見て判断しないでくださいな。 マクロ ast_test_flag(p,flag) は、第1引数にflagsというメンバを 持つ構造体のポインタがくることを仮定してるんです。 typedef struct { unsigned int flags; } Foo; int bar(Foo *fooPtr) { if (ast_test_flag(fooPtr, 1)) { ~ } ~ }
お礼
解答ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
これがどこから出てきたもので「なぜ内容を理解しなければならないのか」が皆目見当もつかないのだが, こういうのはたいてい これで何ができるのか を把握できれば十分. こんな古いソースに現時点でどれほどの価値があるかは知らんが....
お礼
解答ありがとうございます。 オープンソースを追っているときに出てきました。
- TT414
- ベストアンサー率18% (72/384)
>調べてみたのですが、私のCの本には書いていません。 当然です、C言語にはtypeofはありません。 ≻(p)->flags & (flag) ≻・単にビット積をとるだけならなぜ(p)&(flags)と書かないのでしょうか? 「(p)->flags & (flag)」と「(p)&(flags)」は違います。
- wormhole
- ベストアンサー率28% (1626/5665)
この場合の行末の \ は「次の行に続く。」という意味です。 なので #define ast_test_flag(p,flag) ({ typeof ((p)->flags) __p = (p)->flags; typeof (__unsigned_int_flags_dummy) __x = 0; (void) (&__p == &__x); ((p)->flags & (flag)); }) と同じ。 >typeof ((p)->flags) __p = (p)->flags; \ >typeof (__unsigned_int_flags_dummy) __x = 0; \ >(void) (&__p == &__x); \ この3行はやってることに意味ないので省略 (概略だと__pという変数と__xという変数を定義してそれらのアドレスが等しいか調べ結果は捨てる) 最終的には #define ast_test_flat(p,flag) ((p)->flags & (flag)) かな。
お礼
丁寧な解答ありがとうございます。 重ねて質問なのですが、 ・typeof とは何を行っているのでしょうか。 ・(p)->flagsとはなんでしょうか?どこでも宣言してない ・単にビット積をとるだけならなぜ(p)&(flags)と書かないのでしょうか? 調べてみたのですが、私のCの本には書いていません。 どなたか教えてくれませんか?
お礼
丁寧な解答ありがとうございました。