同時通過gcc編譯器的源代碼瀏覽器(gcc/C系列/ C-pragma.c)我看到:這是什麼(())?
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
也不管有很多的C編程幾年我身後的,這些位:(())
是我完全不知道。有人可以解釋他們的意思嗎?谷歌似乎沒有找到它。
同時通過gcc編譯器的源代碼瀏覽器(gcc/C系列/ C-pragma.c)我看到:這是什麼(())?
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
也不管有很多的C編程幾年我身後的,這些位:(())
是我完全不知道。有人可以解釋他們的意思嗎?谷歌似乎沒有找到它。
它們是GCC內部的「魔術」,即編譯器實現本身的一部分。
查看this page談論它們的用法。該宏用於標記垃圾收集目的的類型。也可以有參數,詳見this page。
UPDATE ::正如Drew Dorman在評論中指出的,實際的雙括號不是GNU實現的「內在性」的一部分;當你想將所有參數列表集中到一個被調用的宏的參數中時,它們通常被使用。這在包裝例如包裝時可能是有用的。 printf()
。 See this question, for more on this technique。
希望更多解釋如下.. – Krishnabhadra 2013-02-15 08:59:38
@Krishnabhadra解釋可以在鏈接的網站上找到。關於與GTY-marker imo相關的GCC特徵的進一步解釋將超出這個特定問題和答案的範圍。 – 2013-02-15 09:06:09
'(())'本身**不是** gcc魔術。它允許包含逗號的文本作爲單個參數傳遞給宏。對於任何C/C++編譯器。 – 2013-02-15 16:36:18
通常,它與宏一起用來屏蔽逗號。鑑於#define foo(a,b)
,宏調用foo(1,2,3)
將是非法的。使用額外的一對括號說明哪個逗號被屏蔽:foo((1,2),3)
與foo(1,(2,3))
。
在這種情況下,GTY
可以採用多個參數,用逗號分隔,但所有這些逗號必須被屏蔽。這就是爲什麼圍繞所有參數的內部()
。
你能解釋爲什麼有人應該使用這種電話嗎? – swaechter 2013-02-15 11:11:03
例如'#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
@Albertus:如果你將模板傳遞給一個宏'Macro((Pair
這是什麼'GTY'?它沒有在語言標準中定義。查看你的代碼。 – 2013-02-15 08:57:49
是GTY宏? – Anshul 2013-02-15 08:59:51
你可以通過在查詢字符串中指定網站在Google上找到它:GTY網站:gcc.gnu.org' – ericson 2013-02-20 01:38:07