90

gcc コンパイラのソース コード (gcc/c-family/c-pragma.c) を参照すると、次のように表示されます。

typedef struct GTY(()) align_stack {
  int                  alignment;
  tree                 id;
  struct align_stack * prev;
} align_stack;

そして、私が何年も C プログラミングを行ってきたにもかかわらず、これらのビット(())はまだ私にはまったく知られていません。誰かが彼らの意味を説明してもらえますか? Googleはそれを見つけられないようです。

4

2 に答える 2

82

それらは GCC 内部の「魔法」、つまりコンパイラの実装自体の一部です。

それらの使用について説明しているこのページを参照してください。マクロは、ガベージ コレクションの目的で型をマークするために使用されます。引数もある場合があります。詳細については、このページを参照してください。

UPDATE :: Drew Dormanがコメントで指摘したように、実際の二重括弧は GNU 実装の「内部性」の一部ではありません。これらは、引数のリスト全体を、呼び出されたマクロの 1 つの引数にまとめたい場合によく使用されます。これは、たとえば をラッピングするときにも役立つことがありprintf()ます。このテクニックの詳細については、この質問を参照してください

于 2013-02-15T08:57:02.993 に答える
44

一般に、コンマをシールドするためにマクロで使用されます。が与えられ#define foo(a,b)た場合、マクロの呼び出しfoo(1,2,3)は不正になります。余分な括弧のペアを使用すると、どのコンマがシールドされているかが明確になりfoo((1,2),3)ますfoo(1,(2,3))

この場合、 はGTYカンマで区切られた複数の引数を取ることができますが、これらのカンマはすべてシールドする必要があります。そのため、内側()はすべての引数を囲んでいます。

于 2013-02-15T10:18:00.930 に答える