Apa ini (( ))?

90

Saat menelusuri kode sumber kompilator gcc (gcc / c-family / c-pragma.c) saya melihat:

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

dan terlepas dari banyaknya tahun pemrograman C di belakang saya, bagian-bagian ini: (())sama sekali belum saya ketahui. Bisakah seseorang menjelaskan apa yang mereka maksud? Google sepertinya tidak menemukannya.

Ferenc Deak
sumber
Dan apakah ini GTY? Itu tidak ditentukan dalam standar bahasa. Lihat kode Anda.
Alexey Frunze
7
apakah GTY adalah makro ???
Anshul
1
Anda dapat menemukannya di Google dengan menentukan situs dalam string kueri sebagai berikut:GTY site:gcc.gnu.org
ericson

Jawaban:

81

Mereka adalah "keajaiban" internal GCC, yaitu bagian dari implementasi kompilator itu sendiri.

Lihat halaman ini yang membahas tentang penggunaannya. Makro digunakan untuk menandai jenis untuk tujuan pengumpulan sampah. Mungkin ada argumen juga, lihat halaman ini untuk detailnya.

UPDATE :: Seperti yang ditunjukkan oleh Drew Dorman dalam sebuah komentar, tanda kurung ganda sebenarnya bukan bagian dari "internalitas" implementasi GNU; mereka biasanya digunakan saat Anda ingin mengumpulkan seluruh daftar argumen ke dalam satu argumen untuk disebut makro. Ini terkadang berguna saat membungkus misalnya printf(), juga. Lihat pertanyaan ini, untuk mengetahui lebih lanjut tentang teknik ini .

beristirahat
sumber
5
Penjelasan @krishnabra dapat ditemukan di situs terkait. Penjelasan lebih lanjut tentang fitur GCC yang terkait dengan penanda GTY imo berada di luar cakupan pertanyaan dan jawaban khusus ini.
Arne Mertz
30
(())itu sendiri bukanlah sihir gcc. Ini memungkinkan teks yang menyertakan koma untuk diteruskan ke makro sebagai argumen tunggal. Untuk kompiler C / C ++.
Drew Dormann
45

Secara umum, ini digunakan dengan makro untuk melindungi koma. Mengingat #define foo(a,b), pemanggilan makro foo(1,2,3)akan ilegal. Menggunakan sepasang tanda kurung tambahan menjelaskan koma mana yang dilindungi: foo((1,2),3)versus foo(1,(2,3)).

Dalam hal ini, GTYdapat mengambil beberapa argumen, dipisahkan dengan koma, tetapi semua koma ini harus dilindungi. Itulah mengapa batin ()mengelilingi semua argumen.

MSalters
sumber
2
Bisakah Anda menjelaskan mengapa seseorang harus menggunakan panggilan seperti itu?
swaechter
5
Misalnya #define PRINT_A_LOT(a,b) printf("prefix\n"); printf a; printf("infix\n"); printf b; printf("suffix\n");(Dalam C ++ ada solusi yang lebih bagus daripada makro, tentunya).
MSalters
@Albertus: juga akan menyenangkan, jika Anda meneruskan templat ke makro Macro((Pair<int, int>), ...). Meskipun kemudian Anda mengalami masalah tambahan, menyingkirkan tanda kurung dalam makro
BeniBela