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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren