Seite 1 von 1
C99 Designators oder Initialisieren einmal anders
Verfasst: Sa Feb 12, 2011 12:01 am
von Kerli
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'
};
Re: C99 Designators oder Initialisieren einmal anders
Verfasst: Sa Feb 12, 2011 10:44 am
von Xin
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.
Re: C99 Designators oder Initialisieren einmal anders
Verfasst: So Feb 13, 2011 4:33 pm
von MoonGuy
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?
Re: C99 Designators oder Initialisieren einmal anders
Verfasst: So Feb 13, 2011 8:31 pm
von Kerli
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.