Forum: Compiler & IDEs Zuweisung Strukturmember - Form korrekt?


von Uli (Gast)


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

von Karl H. (kbuchegg)


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.

von Markus F. (mfro)


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
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Uli (Gast)


Lesenswert?

Ok, danke für die Infos...!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Uli schrieb:

> log

Nicht gerade eine glückliche Wahl für einen Variablen- oder 
Komponentennamen, denn log ist eine Standardfunktion.

von Rolf M. (rmagnus)


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.

von Nase (Gast)


Lesenswert?

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

Ich denke, das war nicht immer so.
Man beachte die Struktur "tm" aus <time.h>...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.