これは何ですか (( ))?


90

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

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

何年も前にCプログラミングをたくさん行っていても、これらのビット(())はまだ完全に不明です。誰かがそれらの意味を説明できますか?グーグルはそれを見つけていないようです。


そして、これは何GTYですか?言語標準では定義されていません。コードを確認してください。
Alexey Frunze 2013

7
GTYはマクロですか???
Anshul 2013

1
あなたは次のようにクエリ文字列にサイトを指定することで、Googleでそれを見つけることができます:GTY site:gcc.gnu.org
エリクソン

回答:


81

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

これらの使用法については、このページを参照してください。マクロは、ガベージコレクションの目的で型をマークするために使用されます。議論もありえます、詳細はこのページを見てください

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


5
@Krishnabhadraの説明はリンク先のサイトにあります。GTYマーカーimoに関連するGCC機能についての詳細な説明は、この特定の質問と回答の範囲を超えています。
Arne Mertz、2013

30
(())それ自体はgccマジックではありません。カンマを含むテキストを単一の引数としてマクロに渡すことができます。C / C ++コンパイラの場合。
Drew Dormann 2013

45

一般に、マクロと組み合わせてコンマをシールドします。の場合#define foo(a,b)、マクロの呼び出しfoo(1,2,3)は違法になります。:遮蔽さコンマ括弧の明確化の余分なペア用いてfoo((1,2),3)対をfoo(1,(2,3))

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


2
なぜ誰かがそのような呼び出しを使用する必要があるのか​​説明できますか?
swaechter 2013

5
#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(もちろん、C ++ではマクロよりも優れたソリューションがあります)。
MSalters 2013

@Albertus:テンプレートをマクロに渡すと、さらに便利ですMacro((Pair<int, int>), ...)。その後、さらに問題が発生しますが、マクロ内の括弧を取り除く
BeniBela 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.