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.
GTY
? Itu tidak ditentukan dalam standar bahasa. Lihat kode Anda.GTY site:gcc.gnu.org
Jawaban:
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 .sumber
(())
itu sendiri bukanlah sihir gcc. Ini memungkinkan teks yang menyertakan koma untuk diteruskan ke makro sebagai argumen tunggal. Untuk kompiler C / C ++.Secara umum, ini digunakan dengan makro untuk melindungi koma. Mengingat
#define foo(a,b)
, pemanggilan makrofoo(1,2,3)
akan ilegal. Menggunakan sepasang tanda kurung tambahan menjelaskan koma mana yang dilindungi:foo((1,2),3)
versusfoo(1,(2,3))
.Dalam hal ini,
GTY
dapat mengambil beberapa argumen, dipisahkan dengan koma, tetapi semua koma ini harus dilindungi. Itulah mengapa batin()
mengelilingi semua argumen.sumber
#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).Macro((Pair<int, int>), ...)
. Meskipun kemudian Anda mengalami masalah tambahan, menyingkirkan tanda kurung dalam makro