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