Просматривая исходный код компилятора gcc (gcc / c-family / c-pragma.c), я вижу:
typedef struct GTY(()) align_stack {
int alignment;
tree id;
struct align_stack * prev;
} align_stack;
и, несмотря на то, что у меня за плечами много лет программирования на C, эти биты: (())
мне еще полностью неизвестны. Может кто-нибудь объяснить, что они означают? Гугл вроде не находит.
GTY
? Это не определено в языковом стандарте. Смотрите свой код.GTY site:gcc.gnu.org
Ответы:
Это внутренняя «магия» GCC, то есть часть самой реализации компилятора.
См. Эту страницу, где рассказывается об их использовании. Макрос используется для маркировки типов для целей сборки мусора. Также могут быть аргументы, подробности см. На этой странице .
ОБНОВЛЕНИЕ :: Как указал Дрю Дорман в комментарии, фактические двойные скобки не являются частью «внутренней сущности» реализации GNU; они обычно используются, когда вы хотите собрать весь список аргументов в один аргумент для вызываемого макроса. Иногда это может быть полезно, например
printf()
, при упаковке . См. Этот вопрос, чтобы узнать больше об этой технике .источник
(())
сам по себе не является магией gcc. Он позволяет передать макросу текст, содержащий запятые, как один аргумент. Для любого компилятора C / C ++.В общем, он используется с макросами для защиты запятых. Учитывая
#define foo(a,b)
, что вызов макросаfoo(1,2,3)
был бы незаконным. Использование дополнительной пары круглых скобок поясняет, какая запятая экранирована: поfoo((1,2),3)
сравнению сfoo(1,(2,3))
.В этом случае
GTY
может принимать несколько аргументов, разделенных запятыми, но все эти запятые должны быть экранированы. Вот почему внутреннее()
окружает все аргументы.источник
#define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");
(в C ++, конечно, есть более приятные решения, чем макросы).Macro((Pair<int, int>), ...)
. Хотя тогда вы