Що це (( ))?


90

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

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

і незалежно від того, що у мене за плечима багато років програмування на С, ці біти: (())для мене поки абсолютно невідомі. Хтось може пояснити, що вони означають? Google, схоже, не знаходить.


І що це таке GTY? Це не визначено мовним стандартом. Перегляньте свій код.
Олексій Фрунзе

7
GTY - це макрос ???
Аншул

1
Ви можете знайти його в Google, вказавши сайт у рядку запиту наступним чином:GTY site:gcc.gnu.org
ericson

Відповіді:


81

Вони є внутрішньою "магією" GCC, тобто частиною самої реалізації компілятора.

Дивіться цю сторінку, яка розповідає про їх використання. Макрос використовується для позначення типів для збирання сміття. Тут також можуть бути аргументи. Докладніше див. На цій сторінці .

ОНОВЛЕННЯ :: Як зазначив Дрю Дорман у коментарі, фактичні подвійні дужки не є частиною "внутрішності" реалізації GNU; вони зазвичай використовуються, коли потрібно зібрати весь список аргументів в один аргумент для викликаного макросу. Це може бути корисно іноді під час обгортання, наприклад printf(). Докладніше про цю техніку див. У цьому питанні .


5
Пояснення @Krishnabhadra можна знайти на пов'язаному веб-сайті. Подальше пояснення особливостей GCC, пов’язаних із маркером GTY imo, виходило б за рамки цього конкретного питання та відповіді.
Arne Mertz

30
(())саме по собі не є магією gcc. Це дозволяє передавати текст, що включає коми, до макросу як єдиний аргумент. Для будь-якого компілятора C / C ++.
Drew Dormann

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("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(у C ++ є, звичайно, кращі рішення, ніж макроси).
MSalters

@Albertus: також було б непогано, якщо ви передасте шаблони макросу Macro((Pair<int, int>), ...). Хоча тоді у вас виникають додаткові проблеми, позбувшись дужок всередині макросу
BeniBela
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.