Bu nedir (( ))?


90

Gcc derleyici kaynak koduna (gcc / c-family / c-pragma.c) göz atarken şunu görüyorum:

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

ve arkamda birçok C programlama yılı olmasına bakılmaksızın, bu parçalar: (())henüz benim için tamamen bilinmemektedir. Lütfen birisi ne demek istediğini açıklayabilir mi? Google bulamıyor gibi görünüyor.


Ve bu GTYnedir? Dil standardında tanımlanmamıştır. Kodunuzu görün.
Alexey Frunze

7
GTY bir makro mu ???
Anshul

1
Sorgu dizesinde siteyi aşağıdaki gibi belirterek Google'da bulabilirsiniz:GTY site:gcc.gnu.org
ericson

Yanıtlar:


81

GCC dahili "sihirli" dir, yani derleyici uygulamasının kendisinin bir parçasıdır.

Kullanımlarından bahseden bu sayfaya bakın . Makro, çöp toplama amacıyla türleri işaretlemek için kullanılır. Tartışmalar da olabilir, ayrıntılar için bu sayfaya bakın.

GÜNCELLEME : Drew Dorman'ın bir yorumda işaret ettiği gibi , gerçek çift parantez GNU uygulamasının "içselliğinin" bir parçası değildir; aranan makro için tek bir bağımsız değişken içinde tüm bir bağımsız değişken listesini toplamak istediğinizde genellikle kullanılırlar. Bu, bazen örneğin sararken de yararlı olabilir printf(). Bu teknik hakkında daha fazla bilgi için bu soruya bakın .


5
@Krishnabhadra açıklaması bağlantılı sitede bulunabilir. GTY-işaretleyici imo ile ilgili GCC özellikleri hakkında daha fazla açıklama, bu özel soru ve cevabın kapsamı dışındadır.
Arne Mertz

30
(())kendisi gcc büyüsü değildir . Virgül içeren bir metnin bir makroya tek bir bağımsız değişken olarak aktarılmasına izin verir. Herhangi bir C / C ++ derleyicisi için.
Drew Dormann

45

Genel olarak, virgülleri korumak için makrolarla birlikte kullanılır. Verildiğinde #define foo(a,b), makro çağrı foo(1,2,3)yasadışı olacaktır. Fazladan bir parantez çifti kullanmak, hangi virgülün korumalı olduğunu açıklar: foo((1,2),3)karşı foo(1,(2,3)).

Bu durumda, GTYvirgülle ayrılmış birden çok argüman alabilir, ancak tüm bu virgüller korumalı olmalıdır. Bu yüzden içsel ()tüm tartışmaları kuşatır.


2
Birinin neden böyle bir arama yapması gerektiğini açıklayabilir misiniz?
swaechter

5
Örneğin #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(C ++ 'da makrolardan daha güzel çözümler var elbette).
MSalters

@Albertus: Şablonları bir makroya aktarırsanız da iyi olur Macro((Pair<int, int>), ...). Her ne kadar o zaman ek belaya
giriyorsunuz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.