Yapı başlatıcıda nokta (.) Ne anlama geliyor?


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

Bu C sözdizimini iyi anlamıyorum. Sözdiziminin adını bilmediğim için arama bile yapamıyorum. Bu da ne?


Yapı başlatıcıya benziyor.
Mysticial

7
C99'da standartlaştırılmıştır, bu nedenle (gerçekten) eski bir derleyiciniz varsa çalışmayacaktır.
Bir programcı dostum

2
Sonunda bunun bağlantısını buldu: stackoverflow.com/questions/330793/…
Mysticial

5
Ne yazık ki, MSVC'nin şu anki sürümleri bile bu standarda göre '(gerçekten) eski derleyicilerdir'.
Jonathan Leffler

Kesinlikle tuhaf, bu soruyu bir sigorta eğitiminden geçerken ve aynı başlatıcıyı yazarken de aradım.
Keegan Jay

Yanıtlar:


142

Bu, yapının belirli alanlarını bir başlatıcıda isme göre ayarlamanıza izin veren bir C99 özelliğidir. Bundan önce, başlatıcının sırayla tüm alanlar için sadece değerleri içermesi gerekiyordu - ki bu da elbette çalışıyor.

Yani aşağıdaki yapı için:

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

...kullanabilirsiniz

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

...veya:

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

...ya da:

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

... son ikisi yalnızca C99 için olsa da.


Nokta başlatma C ++ 'da da çalışıyor mu? (Test etmem gerekiyor)
Gabriel Staples

1
Öyle görünüyor, ancak yalnızca C ++ 20 için, sadece belgelere bakarak. C için cppreference.com belgeleri (C99'dan beri çalışır): en.cppreference.com/w/c/language/struct_initialization ve C ++ için (yalnızca C ++ 20 için çalışır): en.cppreference.com/w/cpp / dil / aggregate_initialization .
Gabriel Staples

Gcc kullanarak C ++ için bu "nokta başlatma" türü formunu yeni denediğimi ve gcc C ++ 'nın tüm sürümlerinin bunu desteklediği anlaşılıyor, bu yüzden bahse girerim bir gcc uzantısı olarak gcc tarafından destekleniyor, yani C ++ 20'den önce I gcc / g ++ dışı derleyiciler için taşınabilir olması gerekmediğinden şüphelenir. Bununla birlikte, gcc / g ++ derleyicileri kullanıyorum, bu yüzden C ++ için gcc tarafından destekleniyorsa, onu kullanabilirim.
Gabriel Staples

Nokta başlatmada potansiyel bir sorun vardır (en azından bazı derleyicilerde). struct demo_s demo = { .first = 1, .first = 9 };Benim GCC birinde bu uyarı olmadan derlemek ve ilk 9. olacak
Renate


15

designated initialisation(Bkz. Atanmış Başlatıcılar ) olarak bilinir . Bir "başlatıcı listesi", Her ' .', designatorbu durumda fuse_oprations' hello_oper' tanımlayıcı tarafından belirlenen nesne için başlatılacak ' ' yapının belirli bir üyesini adlandıran bir " " dir .


0

Tüm sözdizimi, COD3BOY tarafından daha önce bahsedildiği gibi atanmış başlatıcı olarak bilinir ve genel olarak, bazı belirli veya varsayılan değerlere bildirim sırasında yapınızı başlatmanız gerektiğinde kullanılır.

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.