0

Linux のソース コードを読んでいるときに、奇妙な構文を見つけました。container_of マクロは次のようになります

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

私を混乱させたのは、 ({statement1; statement2;}) のような構文です

次のような簡単なコードを試しました

int a = {1;2;};

gccでコンパイルしました。実行後、'a' は 2 のように見えましたが、Microsoft VC++ でコンパイルできませんでした。この構文は gcc の拡張機能ですか? もしそうなら、複数のステートメントを定義し、マクロを使用して値を返すなど、gcc 展開なしで同じ効果を得るにはどうすればよいですか?

4

1 に答える 1

2

({...構文は、ステートメント式})と呼ばれる GCC 拡張です。

typeofは別のGCC 拡張機能です。

どちらの拡張機能も、 LLVM/Clang (または TinyCC)などの他のコンパイラで利用できます。

Linux カーネルはそれらを頻繁に使用します。

それらを避けるのはかなり難しいでしょう。本当にやりたいのであれば、GIMPLEから低レベルで、移植性がなく、読み取り不能な C への変換を検討することもできます (これは簡単な作業ではありません)。そのためにMELTを使用することもできます (作業の一部はmelt/xtramelt-c-generator.meltJ.Salvucciによるそのファイル)。

于 2013-07-17T13:51:45.957 に答える