2013-02-15 7 views
90

GCCコンパイラのソースコードを閲覧しながら(GCC/C-家族/ C-pragma.c)私は以下を参照してくださいこれは何ですか(())?

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

とにかかわらず、私の後ろにCプログラミング年の多くを持つのは、これらのビット:(())ですまだ私には全く知られていません。誰かが何を意味するのか説明できますか? Googleはそれを見つけるようではありません。

+0

この「GTY」とは何ですか?言語標準では定義されていません。あなたのコードを見てください。 –

+7

はGTYマクロですか? – Anshul

+1

Googleでは、以下のようにクエリ文字列にsiteを指定することで見つけることができます: 'GTY site:gcc.gnu.org' – ericson

答えて

81

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

this pageを参照してください。マクロは、ガベージコレクションの目的で型をマークするために使用されます。引数もあります。詳しくは、this pageを参照してください。

UPDATE ::コメントでDrew Dormanで指摘したように、実際の重括弧は、GNUの実装の「internalness」の一部ではありません。引数のリスト全体を呼び出されたマクロの単一の引数に集めたいときによく使われます。これは、ラッピングなどのときに便利なことがあります。 printf()もあります。 See this question, for more on this technique

+11

希望ビット詳細は後で続きます。 – Krishnabhadra

+5

@Krishnabhadraの説明はリンク先サイトにあります。 GTYマーカーに関連するGCCの特徴についてのさらなる説明は、この特定の質問および回答の範囲を超えている。 –

+29

'(())'自体は** gccの魔法ではありません。カンマを含むテキストを単一の引数としてマクロに渡すことができます。任意のC/C++コンパイラ用。 –

45

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

この場合、GTYは複数の引数をカンマで区切って指定できますが、これらのカンマはすべてシールドする必要があります。だからこそ内部の()はすべての引数を囲んでいる。

+2

誰かがこのような呼び出しを使用する理由を説明できますか? – swaechter

+5

など。 '#define PRINT_A_LOT(a、b)printf("プレフィックス\ n "); printf a; printf( "インフィックス\ n"); printf b; printf( "接尾辞\ n"); '(C++ではもちろんマクロよりも良い解決法があります)。 – MSalters

+0

@Albertus:テンプレート 'マクロ((Pair )、...)'にテンプレートを渡すといいでしょう。しかし、マクロ内のカッコを取り除くという追加の問題が発生します – BeniBela

関連する問題