2013-02-15 189 views
90

同時通過gcc編譯器的源代碼瀏覽器(gcc/C系列/ C-pragma.c)我看到:這是什麼(())?

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

也不管有很多的C編程幾年我身後的,這些位:(())是我完全不知道。有人可以解釋他們的意思嗎?谷歌似乎沒有找到它。

+0

這是什麼'GTY'?它沒有在語言標準中定義。查看你的代碼。 – 2013-02-15 08:57:49

+7

是GTY宏? – Anshul 2013-02-15 08:59:51

+1

你可以通過在查詢字符串中指定網站在Google上找到它:GTY網站:gcc.gnu.org' – ericson 2013-02-20 01:38:07

回答

81

它們是GCC內部的「魔術」,即編譯器實現本身的一部分。

查看this page談論它們的用法。該宏用於標記垃圾收集目的的類型。也可以有參數,詳見this page

UPDATE ::正如Drew Dorman在評論中指出的,實際的雙括號不是GNU實現的「內在性」的一部分;當你想將所有參數列表集中到一個被調用的宏的參數中時,它們通常被使用。這在包裝例如包裝時可能是有用的。 printf()See this question, for more on this technique

+11

希望更多解釋如下.. – Krishnabhadra 2013-02-15 08:59:38

+5

@Krishnabhadra解釋可以在鏈接的網站上找到。關於與GTY-marker imo相關的GCC特徵的進一步解釋將超出這個特定問題和答案的範圍。 – 2013-02-15 09:06:09

+29

'(())'本身**不是** gcc魔術。它允許包含逗號的文本作爲單個參數傳遞給宏。對於任何C/C++編譯器。 – 2013-02-15 16:36:18

45

通常,它與宏一起用來屏蔽逗號。鑑於#define foo(a,b),宏調用foo(1,2,3)將是非法的。使用額外的一對括號說明哪個逗號被屏蔽:foo((1,2),3)foo(1,(2,3))

在這種情況下,GTY可以採用多個參數,用逗號分隔,但所有這些逗號必須被屏蔽。這就是爲什麼圍繞所有參數的內部()

+2

你能解釋爲什麼有人應該使用這種電話嗎? – swaechter 2013-02-15 11:11:03

+5

例如'#define PRINT_A_LOT(a,b)printf(「prefix \ n」); printf a;的printf( 「綴\ n」); printf b; printf(「suffix \ n」);'(當然,在C++中有比宏更好的解決方案)。 – MSalters 2013-02-15 12:52:57

+0

@Albertus:如果你將模板傳遞給一個宏'Macro((Pair ),...)',也會很好。儘管如此,你還是遇到了額外的麻煩,要擺脫宏中的括號 – BeniBela 2013-02-21 13:46:40