2013-02-15 2 views
90

При просмотре через GCC компилятор исходного кода (ССАГПЗ/с-семьи/с-pragma.c) Я вижу:Что это (())?

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

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

+0

И что это за 'GTY'? Он не определен в стандарте языка. Посмотрите на свой код. –

+7

GTY макрос ??? – Anshul

+1

Вы можете найти его в Google, указав сайт в строке запроса следующим образом: 'GTY-сайт: gcc.gnu.org' – ericson

ответ

81

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

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

ОБНОВЛЕНИЕ :: Как указано в комментарии Drew Dorman, фактическая двойная скобка не является частью «внутренней» реализации GNU; они обычно используются, когда вы хотите собрать весь список аргументов в один аргумент для вызываемого макроса. Это может быть полезно иногда при упаковке, например. printf(), тоже. See this question, for more on this technique.

+11

надеюсь, что последует больше объяснений. – Krishnabhadra

+5

@ Описание Krishnabhadra можно найти на связанном сайте. Дальнейшее объяснение функций GCC, связанных с GTY-маркером imo, выходит за рамки этого конкретного вопроса и ответа. –

+29

'(())' само по себе ** не ** gcc magic. Он позволяет передавать текст, содержащий запятые, в макрос как один аргумент. Для любого компилятора C/C++. –

45

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

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

+2

Можете ли вы объяснить, почему кто-то должен использовать такой вызов? – swaechter

+5

. '#define PRINT_A_LOT (a, b) printf (" префикс \ n "); printf a; Е ("инфикс \ п"); printf b; printf ("suffix \ n"); '(на C++, конечно, есть более приятные решения, чем макросы). – MSalters

+0

@Albertus: было бы неплохо, если вы передадите шаблоны макросу 'Macro ((Pair ), ...)'. Хотя тогда у вас возникают дополнительные проблемы, избавляясь от скобок в макросе – BeniBela

Смежные вопросы