Что это (( ))? - программирование
Подтвердить что ты не робот

Что это (( ))?

При просмотре исходного кода gcc-компилятора (gcc/c-family/c-pragma.c) я вижу:

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

и независимо от того, что у меня много лет программирования C, эти бит: (()) пока еще мне неизвестны. Может кто-нибудь объяснить, что они означают? Google, похоже, не находит его.

4b9b3361

Ответ 1

Это внутренняя "магия" GCC, то есть часть самой реализации компилятора.

Смотрите эту страницу, в которой говорится об их использовании. Макрос используется для обозначения типов для сбора мусора. Также могут быть аргументы, см. эту страницу для деталей.

ОБНОВЛЕНИЕ:: Как отметил Дрю Дорман в комментарии, фактическая двойная скобка не является частью "внутренней" реализация GNU; они обычно используются, когда вы хотите собрать весь список аргументов в один аргумент для вызываемого макроса. Это может быть полезно иногда при упаковке, например. printf() тоже. См. этот вопрос, более подробно об этом методе.

Ответ 2

В общем, он используется с макросами для защиты запятых. Учитывая #define foo(a,b), вызов макроса foo(1,2,3) был бы незаконным. Использование дополнительной пары круглых скобок уточняет, какая запятая экранирована: foo((1,2),3) по сравнению с foo(1,(2,3)).

В этом случае GTY может принимать несколько аргументов, разделенных запятыми, но все эти запятые должны быть экранированы. Вот почему внутренний () окружает все аргументы.