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?


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.


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 ' '.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.