Was bedeutet Punkt (.) In einem Strukturinitialisierer?

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

Ich verstehe diese C-Syntax nicht gut. Ich kann nicht einmal suchen, weil ich den Namen der Syntax nicht kenne. Was ist das?

Benjamin
quelle
Es sieht aus wie ein Strukturinitialisierer.
Mysticial
7
Standardisiert in C99, funktioniert also nicht, wenn Sie einen (wirklich) alten Compiler haben.
Einige Programmierer Typ
2
Endlich den Link dafür gefunden: stackoverflow.com/questions/330793/…
Mysticial
5
Leider sind auch die aktuellen Versionen von MSVC nach diesem Standard "(wirklich) alte Compiler".
Jonathan Leffler
Absolut bizarr, ich habe diese Frage durchsucht, während ich gleichzeitig ein Sicherungs-Tutorial durchgesehen und genau denselben Initialisierer geschrieben habe.
Keegan Jay

Antworten:

141

Dies ist eine C99-Funktion, mit der Sie bestimmte Felder der Struktur in einem Initialisierer nach Namen festlegen können. Zuvor musste der Initialisierer nur die Werte für alle Felder der Reihe nach enthalten - was natürlich immer noch funktioniert.

Also für die folgende Struktur:

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

... können Sie verwenden

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

...oder:

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

...oder auch:

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

... obwohl die letzten beiden nur für C99 sind.

Dmitri
quelle
Funktioniert die Punktinitialisierung auch in C ++? (Ich muss es testen)
Gabriel Staples
1
Es scheint, dass dies der Fall ist, aber nur für C ++ 20, wenn man sich nur die Dokumentation ansieht. Hier ist die Dokumentation zu cppreference.com für C (funktioniert seit C99): en.cppreference.com/w/c/language/struct_initialization und für C ++ (funktioniert nur für C ++ 20): en.cppreference.com/w/cpp / language / aggregat_initialization .
Gabriel Staples
Beachten Sie, dass ich gerade dieses Formular vom Typ "Punktinitialisierung" für C ++ mit gcc ausprobiert habe und es anscheinend von allen Versionen von gcc C ++ unterstützt wird. Ich wette, es wird von gcc als gcc-Erweiterung unterstützt, dh vor C ++ 20 I. Ich vermute, es ist nicht unbedingt für Nicht-gcc / g ++ - Compiler portierbar. Davon abgesehen verwende ich gcc / g ++ - Compiler. Wenn es also von gcc für C ++ unterstützt wird, kann ich es auch verwenden.
Gabriel Staples
Bei der Punktinitialisierung gibt es ein potenzielles Problem (zumindest bei einigen Compilern). struct demo_s demo = { .first = 1, .first = 9 };Auf einem meiner GCC wird dies ohne Vorwarnung kompiliert und zuerst wird es 9.
Renate
15

Es ist bekannt als designated initialisation(siehe Designated Initializers ). Eine "Initialisiererliste". Jedes ' .' ist ein " designator", das in diesem Fall ein bestimmtes Mitglied der ' fuse_oprations' Struktur benennt, das für das durch die ' hello_oper' Kennung angegebene Objekt initialisiert werden soll.

COD3BOY
quelle
0

Die gesamte Syntax wird als designierter Initialisierer bezeichnet, wie bereits von COD3BOY erwähnt. Sie wird im Allgemeinen verwendet, wenn Sie Ihre Struktur zum Zeitpunkt der Deklaration auf bestimmte oder Standardwerte initialisieren müssen.

ind79ra
quelle