Was bedeutet Punkt (.) in einem Struct-Initialisierer?

Lesezeit: 2 Minuten

Benutzeravatar von Benjamin
Benjamin

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?

  • Es sieht aus wie ein Struct-Initialisierer.

    – Mystisch

    8. November 2011 um 7:40 Uhr


  • Standardisiert in C99, funktioniert also nicht, wenn Sie einen (wirklich) alten Compiler haben.

    – Irgendein Programmierer-Typ

    8. November 2011 um 7:43 Uhr

  • Endlich den Link dafür gefunden: stackoverflow.com/questions/330793/…

    – Mystisch

    8. November 2011 um 7:46 Uhr

  • Leider sind selbst die aktuellen Versionen von MSVC nach diesem Standard “(wirklich) alte Compiler”.

    – Jonathan Leffler

    8. November 2011 um 7:52 Uhr

  • Absolut bizarr, ich habe diese Frage gesucht, während ich auch ein Sicherungs-Tutorial durchgegangen bin und genau denselben Initialisierer geschrieben habe.

    – Keegan Jay

    10. April 2018 um 23:44 Uhr


Dies ist eine C99-Funktion, mit der Sie bestimmte Felder der Struktur nach Namen in einem Initialisierer 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.

  • Funktioniert die Punktinitialisierung auch in C++? (muss ich testen)

    – Gabriel Staples

    12. April 2019 um 17:22 Uhr

  • Es scheint, dass dies der Fall ist, aber nur für C ++ 20, wenn Sie sich nur die Dokumentation ansehen. Hier ist die cppreference.com-Dokumentation für C (funktioniert seit C99): en.cppreference.com/w/c/language/struct_initializationund für C++ (funktioniert nur für C++20): en.cppreference.com/w/cpp/language/aggregate_initialization.

    – Gabriel Staples

    12. April 2019 um 17:25 Uhr


  • Beachten Sie, dass ich gerade dieses Formular vom Typ “Punkt-Initialisierung” für C++ mit gcc ausprobiert habe und es scheint, dass alle Versionen von gcc C++ es unterstützen, also wette ich, dass es von gcc als gcc-Erweiterung unterstützt wird, was bedeutet, dass ich vor C++20 I vermuten, dass es nicht unbedingt auf Nicht-gcc/g++-Compiler portierbar ist. Abgesehen davon verwende ich gcc/g++-Compiler. Wenn es also von gcc für C++ unterstützt wird, könnte ich es genauso gut verwenden.

    – Gabriel Staples

    9. November 2019 um 7:10 Uhr


  • Es gibt einen möglichen Fallstrick bei der Punktinitialisierung (zumindest bei einigen Compilern). struct demo_s demo = { .first = 1, .first = 9 }; Auf einem meiner GCC wird dies ohne Vorwarnung kompiliert und zuerst 9 sein.

    – Renate

    8. Februar 2020 um 2:16 Uhr


Benutzeravatar von Dan Aloni
Dan Aloni

Das sind C99 ausgewiesene Initialisierer.

Benutzeravatar von COD3BOY
COD3BOY

Es ist bekannt als designated initialisation (sehen Ausgewiesene Initialisierer). Eine “Initialisierer-Liste”, Jeder ‘.‘ ist ein “designator“, der in diesem Fall ein bestimmtes Mitglied der ‘fuse_oprations‘ struct zum Initialisieren für das durch das ‘ bezeichnete Objekthello_oper‘ Kennung.

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

1424510cookie-checkWas bedeutet Punkt (.) in einem Struct-Initialisierer?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy