C99 Designators oder Initialisieren einmal anders

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

C99 Designators oder Initialisieren einmal anders

Beitrag von Kerli » Sa Feb 12, 2011 12:01 am

Heute bin ich einmal auf eine interessante Möglichkeit von C99 gestoßen, die mir bis jetzt noch überhaupt nicht bekannt war. Es ist zwar nur der bekannt Syntacitc Sugar, es erlaubt aber leserlicheren und besser wartbareren Code zu erzeugen, vor allem beim Initialisieren von Strukturen. Wer glaubt der folgende Code ist nicht C, sollte einmal einen C-Compiler anwerfen und es selbst ausprobieren ;) Dieses Feature nennt sich im Standard übrigens designator, oder zu Deutsch "Bezeichner". In C++ ist das wohl verloren gegangen; Dafür gibt es dort Konstruktoren...

Code: Alles auswählen

typedef struct
{
  int x;
} Test;

Test t[] =
{
  [0].x = 0,
  [5].x = 2
};

int y[] =
{
  [1] = 1,
  [2] = 2
};

struct
{
  int member1;
  char member2;
} blub =
{
  .member1 = 1234,
  .member2 = 'h'
};
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C99 Designators oder Initialisieren einmal anders

Beitrag von Xin » Sa Feb 12, 2011 10:44 am

Kerli hat geschrieben:Heute bin ich einmal auf eine interessante Möglichkeit von C99 gestoßen, die mir bis jetzt noch überhaupt nicht bekannt war. Es ist zwar nur der bekannt Syntacitc Sugar, es erlaubt aber leserlicheren und besser wartbareren Code zu erzeugen, vor allem beim Initialisieren von Strukturen. Wer glaubt der folgende Code ist nicht C, sollte einmal einen C-Compiler anwerfen und es selbst ausprobieren ;)
Das habe ich auch noch nicht gesehen. Und es gefällt mir. => Wiki? ^^
Kerli hat geschrieben:Dieses Feature nennt sich im Standard übrigens designator, oder zu Deutsch "Bezeichner". In C++ ist das wohl verloren gegangen; Dafür gibt es dort Konstruktoren...
C und C++ werden unabhängig voneinander standardisiert, es sind zwei verschiedene Sprachen.
In C gibt es auch Typen fest definierter Breite, während short und int weiterhin nur eine Mindestbreite definieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: C99 Designators oder Initialisieren einmal anders

Beitrag von MoonGuy » So Feb 13, 2011 4:33 pm

Kerli hat geschrieben:Heute bin ich einmal auf eine interessante Möglichkeit von C99 gestoßen, die mir bis jetzt noch überhaupt nicht bekannt war. Es ist zwar nur der bekannt Syntacitc Sugar, es erlaubt aber leserlicheren und besser wartbareren Code zu erzeugen, vor allem beim Initialisieren von Strukturen. Wer glaubt der folgende Code ist nicht C, sollte einmal einen C-Compiler anwerfen und es selbst ausprobieren ;) Dieses Feature nennt sich im Standard übrigens designator, oder zu Deutsch "Bezeichner". In C++ ist das wohl verloren gegangen; Dafür gibt es dort Konstruktoren...

Code: Alles auswählen

typedef struct
{
  int x;
} Test;

Test t[] =
{
  [0].x = 0,
  [5].x = 2
};

int y[] =
{
  [1] = 1,
  [2] = 2
};

struct
{
  int member1;
  char member2;
} blub =
{
  .member1 = 1234,
  .member2 = 'h'
};
Mir gefällt's! Hat jemand mal einen Vergleich gemacht, was schneller ist: Strukturen so zu initialiseren oder Objekte mit ausschließlich Attributen über Konstruktur erstellen?

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: C99 Designators oder Initialisieren einmal anders

Beitrag von Kerli » So Feb 13, 2011 8:31 pm

Xin hat geschrieben:Das habe ich auch noch nicht gesehen. Und es gefällt mir. => Wiki? ^^
Ich habe es mir vorgemerkt und werde es in den nächsten Tagen einmal eintragen :)
MoonGuy hat geschrieben:Mir gefällt's! Hat jemand mal einen Vergleich gemacht, was schneller ist: Strukturen so zu initialiseren oder Objekte mit ausschließlich Attributen über Konstruktur erstellen?
So ein Vergleich ist nicht möglich da es diese Möglichkeit der Initialisierung nur in C und nicht in C++ gibt. Es gibt demnach also auch keine Konstruktoren mit denen man eine Ausführungszeit vergleichen könnte. Ansonsten resultiert eine Initialisierung mit oder ohne Designators genau in dem gleichen Code. Worauf man achten sollte ist, dass wenn man Lücken lässt, also beispielsweise in einem Array ein paar Indices freilasst, diese mit Nullen aufgefüllt werden.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten