Zuweisung Strukturmember - Form korrekt?

Gast #4176043
Lesenswert?
• ▲
▼
Hallo,

ich habe folgenden Code (Ausschnitt):
1
IsoTpShims isotp_init_shims(LogShim log, SendCanMessageShim send_can_message,
2
  SetTimerShim set_timer) {
3
    IsoTpShims shims = {
4
      log: log,
5
      send_can_message: send_can_message,
6
      set_timer: set_timer,
7
      frame_padding: ISO_TP_DEFAULT_FRAME_PADDING_STATUS
8
    };
9
  return shims;
10
}

Mich interessiert, welche Form der Zuweisung der einzelnen Member das 
ist mit dem Doppelpunkt? Habe ich unter c noch nie so gesehen...

IsoTpShims ist wie folgt definiert:
1
typedef struct {
2
  LogShim log;
3
  SendCanMessageShim send_can_message;
4
  SetTimerShim set_timer;
5
  bool frame_padding;
6
} IsoTpShims;

Viele Grüße,
Uli
#4176051
Lesenswert?
• ▲
▼
Das ist eine alte Form, die mal als gcc Erweiterung kursierte, ehe dann 
in C99 eine andere Syntax standardisiert wurde.

Das ist die offizielle, seit C99 standardisierte Form
1
    IsoTpShims shims = {
2
      .log = log,
3
      .end_can_message = send_can_message,
4
      .set_timer = set_timer,
5
      .frame_padding = ISO_TP_DEFAULT_FRAME_PADDING_STATUS
6
    };


https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

gcc enthält viele Erweiterungen, die es nie in Standard C geschafft 
haben.
#4176086
Lesenswert?
• ▲
▼
Wobei das hier nicht wirklich eine Rolle spielt, nachdem ja - wie's 
aussieht - sowieso alle struct-member belegt werden.

Da kann man auch wie in der guten alten Zeit arbeiten und der Code wird 
von jedem Wald- und Wiesencompiler akzeptiert:
1
IsoTpShims isotp_init_shims(LogShim log, SendCanMessageShim send_can_message,
2
        SetTimerShim set_timer) {
3
    IsoTpShims shims = {
4
        log,
5
        send_can_message,
6
        set_timer,
7
        ISO_TP_DEFAULT_FRAME_PADDING_STATUS
8
    };
9
    return shims;
10
}
#4177205
Lesenswert?
• ▲
▼
Rufus Τ. Firefly schrieb:
> Markus F. schrieb:
>> Da kann man auch wie in der guten alten Zeit arbeiten und der Code wird
>> von jedem Wald- und Wiesencompiler akzeptiert:
>
> Man muss nur aufpassen, daß bei dieser Schreibweise die Reihenfolge
> der Elemente wichtig ist -- bei der C99-Variante kann die nach Gutdünken
> geändert werden.

Außerdem ist mit der expliziten Benamsung der Code lesbarer, da man 
nicht extra noch parallel die Definition des Typs ansehen muss, um 
rauszubekommen, welches Member jetzt womit initialisiert wurde.

Johann L. schrieb:
> Uli schrieb:
>
>> log
>
> Nicht gerade eine glückliche Wahl für einen Variablen- oder
> Komponentennamen, denn log ist eine Standardfunktion.

Und? Der Namensraum für Member der Struct ist ein anderer als der für 
Funktionen. Ist also kein Problem.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.