Apa arti titik (.) Dalam penginisialisasi struct?

117
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

Saya tidak memahami sintaks C ini dengan baik. Saya bahkan tidak bisa mencari karena saya tidak tahu nama sintaksnya. Apa itu?

Benjamin
sumber
Ini terlihat seperti penginisialisasi struct.
Mysticial
7
Standarisasi di C99, jadi tidak akan berfungsi jika Anda memiliki kompiler (benar-benar) lama.
Beberapa programmer bung
2
Akhirnya menemukan tautan untuk ini: stackoverflow.com/questions/330793/…
Mysticial
5
Sayangnya, bahkan versi MSVC saat ini adalah '(benar-benar) kompiler lama' menurut standar ini.
Jonathan Leffler
Benar-benar aneh, saya mencari pertanyaan ini sambil juga melalui tutorial sekering, dan menulis penginisialisasi yang sama persis.
Keegan Jay

Jawaban:

141

Ini adalah fitur C99 yang memungkinkan Anda untuk mengatur bidang tertentu dari struct dengan nama di penginisialisasi. Sebelum ini, penginisialisasi hanya perlu berisi nilai, untuk semua bidang, secara berurutan - yang tentu saja masih berfungsi.

Jadi untuk struct berikut:

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...kamu bisa memakai

struct demo_s demo = { 1, 2, 3 };

...atau:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...atau bahkan:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

... meskipun dua yang terakhir hanya untuk C99.

Dmitri
sumber
Apakah inisialisasi titik juga berfungsi di C ++? (Saya perlu mengujinya)
Gabriel Staples
1
Tampaknya memang demikian, tetapi hanya untuk C ++ 20, lihat saja dokumentasinya. Berikut dokumentasi cppreference.com untuk C (berfungsi sejak C99): en.cppreference.com/w/c/language/struct_initialization , dan untuk C ++ (hanya berfungsi untuk C ++ 20): en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples
Perhatikan bahwa saya baru saja mencoba formulir jenis "inisialisasi titik" ini untuk C ++ menggunakan gcc, dan tampaknya semua versi gcc C ++ mendukungnya, jadi saya yakin ini didukung oleh gcc sebagai ekstensi gcc, artinya sebelum C ++ 20 I curiga itu belum tentu portabel untuk kompiler non-gcc / g ++. Meskipun demikian, saya menggunakan kompiler gcc / g ++ jadi jika didukung oleh gcc untuk C ++, sebaiknya saya menggunakannya.
Gabriel Staples
Ada potensi gotcha dalam inisialisasi titik (setidaknya dengan beberapa kompiler). struct demo_s demo = { .first = 1, .first = 9 };Di salah satu GCC saya, ini akan dikompilasi tanpa peringatan dan yang pertama adalah 9.
Renate
15

Ini dikenal sebagai designated initialisation(lihat Penginisialisasi yang Ditunjuk ). Sebuah "daftar-penginisialisasi", Setiap ' .' adalah " designator" yang dalam hal ini menamai anggota tertentu dari fuse_oprationsstruct ' ' untuk menginisialisasi objek yang ditunjuk oleh hello_operpengenal ' '.

COD3BOY
sumber
0

Seluruh sintaks dikenal sebagai penginisialisasi yang ditunjuk sebagaimana telah disebutkan oleh COD3BOY dan digunakan secara umum ketika Anda perlu menginisialisasi struktur Anda pada saat deklarasi ke beberapa nilai tertentu atau default.

ind79ra
sumber