struct C(++) - Syntax Frage

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 428
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub

struct C(++) - Syntax Frage

Beitrag von starcow »

Abend zusammen

Ich bin in einem Stück C(++) Code auf eine Syntax gestossen, die mir so noch nie begegnet ist.
So ganz will mr nicht klar werden, was sie bewirkt.
Etwas abekürzt sieht das ganz folgendermassen aus:

Code: Alles auswählen

const SDL_Rect src = { .x = (int) wert1, .y = (int) wert2, .w = (int) wert3, .h = (int) wert4, };
Soweit ist für mich klar, dass eine konstante Struktur SDL_Rect mit dem Bezeichner src deklariert wird. Dabei wird sie offensichtlich gleich konkret definiert (mit Werten gefüllt), welche zuvor in einen int gecastet wurden.
Nur verstehe ich diese "verschachtelte° Zuweisung an .x .y .w .h nicht. Und irgenwie scheint mir da ein Komma zuviel dabei zu sein (Am Ende, nach wert4).

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Matthias Gubisch
Establishment
Beiträge: 380
Registriert: 01.03.2009, 19:09

Re: struct C(++) - Syntax Frage

Beitrag von Matthias Gubisch »

Dein Stichwort für google ist
Aggregate Initialization bzw. Designated Initializers

Referenz:
https://en.cppreference.com/w/cpp/langu ... ialization

Kurze Erklärung:
https://www.modernescpp.com/index.php/d ... itializers

Das Komma ist überflüssig ja, der Compiler ignoriert es aber wenn mich nicht alles täuscht.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Krishty
Establishment
Beiträge: 7850
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: struct C(++) - Syntax Frage

Beitrag von Krishty »

Matthias Gubisch hat geschrieben: 24.01.2022, 00:28Das Komma ist überflüssig ja, der Compiler ignoriert es aber wenn mich nicht alles täuscht.
Genau, aber bis zum 0x-Standard war das tatsächlich noch ein Syntaxfehler. Starcows Misstrauen war schon richtig :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Jonathan
Establishment
Beiträge: 1959
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: struct C(++) - Syntax Frage

Beitrag von Jonathan »

initialization.mp4
(578.34 KiB) 41-mal heruntergeladen
Lieber dumm fragen, als dumm bleiben!
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 455
Registriert: 05.07.2003, 11:17

Re: struct C(++) - Syntax Frage

Beitrag von Lord Delvin »

Das mit dem Komma wird bzw. wurde in relativ vielen Sprachen mit der Zeit nachgerüstet, weil es zum Parsen egal ist und es schlechten Programmierern hilft Code zu generieren.
XML/JSON in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
joggel

Re: struct C(++) - Syntax Frage

Beitrag von joggel »

Lord Delvin hat geschrieben: 24.01.2022, 11:04 ...und es schlechten Programmierern hilft Code zu generieren.
🤎

Hab gehört aus diesem Grund wurde Github Copilot ins Leben gerufen :)
Benutzeravatar
starcow
Establishment
Beiträge: 428
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub

Re: struct C(++) - Syntax Frage

Beitrag von starcow »

Achso x, y, w, h sind Komponenten von der SDL_Rect Struktur!
Dadurch wird also die Reihenfolge egal, in welcher ich den Komponenten der Struktur Werte zuweise?
Oder anders formuliert: Damit hat man eine Absicherung das mit .x = 50 wirklich x initialisiert wird - auch wenn durch die gegebene Reihenfolge in der Struktur, ohne spezifisches x = 50, eigentlich y initialisiert worden wäre, richtig?
Insofern eigentlich eine sinnvolle Ergänzung, oder?
Ich nehme an, dieses Feature gibts nur unter C++ - und nicht für reines C?

Was ist den der Vorteil, wenn die Sprache so viele Arten der Initialisierung von Strukturen erlaubt? Habe mr die verlinkte CPP-Referenzseite eben angesehen. Das sind doch schon einige... Läuft man da nicht Gefahr, dass eine Sprache dadurch verwässert wird?
Lord Delvin hat geschrieben: 24.01.2022, 11:04 Das mit dem Komma wird bzw. wurde in relativ vielen Sprachen mit der Zeit nachgerüstet, weil es zum Parsen egal ist und es schlechten Programmierern hilft Code zu generieren.
Im Ernst... Ein anderer Grund kann einem da jetzt nicht wirklich einfallen? Aber dies kann wohl nicht der tatsächliche Grund gewesen sein. Eine solche Prämisse wäre doch entgegen jeglicher Sprach-Design-Grundsätze!
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Schrompf
Moderator
Beiträge: 4514
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: struct C(++) - Syntax Frage

Beitrag von Schrompf »

starcow hat geschrieben: 26.01.2022, 11:03 Achso x, y, w, h sind Komponenten von der SDL_Rect Struktur!
Exakt, Du benennst damit die Member, die Du initialisieren willst.
Dadurch wird also die Reihenfolge egal, in welcher ich den Komponenten der Struktur Werte zuweise?
Oder anders formuliert: Damit hat man eine Absicherung das mit .x = 50 wirklich x initialisiert wird - auch wenn durch die gegebene Reihenfolge in der Struktur, ohne spezifisches x = 50, eigentlich y initialisiert worden wäre, richtig?
Nein. Die Member, die Du initialisierst, müssen trotzdem in der Reihenfolge sein, in der sie in der Struktur stehen. Weil C++ Lifetime Scope Gedöns. Aber Du kannst Member auslassen, die werden dann default-initialisiert. Es ist aber primär ein Feature für den Menschen, nicht für die Maschine. Es macht den Unterschied zwischen

Code: Alles auswählen

SomeStruct stuff{ .x = 13, .y = 25, .w = 43, .h = 36 };
und

Code: Alles auswählen

SomeStruct stuff{ 13, 25, 43, 36 };
Was bedeutet jetzt was? Wenn jetzt eine Kollegin die Codebase liest, sieht sie in V1 sofort, was es bedeutet.

Ich nehme Designated Initialization inzwischen ganz gerne.
Ich nehme an, dieses Feature gibts nur unter C++ - und nicht für reines C?
Nein. Das gibt's seit Ewigkeiten in C. Und es ist mit C++17 oder 20 erst für C++ nachgepflegt worden, weil's da halt viel mehr Corner Cases und Ärger geben kann.
Was ist den der Vorteil, wenn die Sprache so viele Arten der Initialisierung von Strukturen erlaubt? Habe mr die verlinkte CPP-Referenzseite eben angesehen. Das sind doch schon einige... Läuft man da nicht Gefahr, dass eine Sprache dadurch verwässert wird?
Jupp. C++ wird inzwischen für Leute entwickelt, die das seit 10+ Jahren machen. Neulinge sterben einen Heldentod, würde ich vermuten.
Im Ernst... Ein anderer Grund kann einem da jetzt nicht wirklich einfallen? Aber dies kann wohl nicht der tatsächliche Grund gewesen sein. Eine solche Prämisse wäre doch entgegen jeglicher Sprach-Design-Grundsätze!
Es ist nur Syntax. Ich hege da keine Gefühle. Ich mach es ganz gern bei irgendwelchen Enums oder Arrays, die ich gelegentlich mal erweitern muss. Da isses einfach bequem, am Ende gefahrlos ein Komma hängenlassen zu können.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: struct C(++) - Syntax Frage

Beitrag von kaiserludi »

Lord Delvin hat geschrieben: 24.01.2022, 11:04 Das mit dem Komma wird bzw. wurde in relativ vielen Sprachen mit der Zeit nachgerüstet, weil es zum Parsen egal ist und es schlechten Programmierern hilft Code zu generieren.
Nein, das ist nicht der Grund dafür.

Der Grund ist vielmehr folgender:
Wenn ich den vom Threadersteller gezeigten Code wie folgt mehrzeilig formatiere

Code: Alles auswählen

const SDL_Rect src =
                               {
                                   .x = (int) wert1,
                                   .y = (int) wert2,
                                   .w = (int) wert3,
                                   .h = (int) wert4,
                               };
dann kann ich nun später im Zuge einer Änderung die vierte Zeile entfernen oder eine fünfte Zeile hinzufügen, ohne dabei die jeweils vorherige Zeile anfassen und dort ein Komma entfernen/ergänzen zu müssen.
Entsprechend habe ich weniger unnötiges Hintergrundrauschen im Versionierungssystem, wenn ich später einmal wissen will, wann welche Zeile wie verändert wurde, denn wenn ich gezielt nach Änderungen an Zeile X Suche, dann interessiert mich ein hinzugefügtes oder entferntes Komma aufgrund einer Änderung in der Folgezeile herzlich wenig, so dass es nützlich ist, wenn ich solche "nur Komma hinzugefügt/entfernt Änderungen" gar nicht erst sehe, weil sie nie nötig waren und ich somit relevante Änderungen schneller finden kann.

Das ist zwar nur eine Kleinigkeit, aber Kleinvieh macht bekanntlich auch Mist.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 455
Registriert: 05.07.2003, 11:17

Re: struct C(++) - Syntax Frage

Beitrag von Lord Delvin »

Wenn das so wäre, wäre meine Frage, warum man das sonst nicht macht. Man könnte es ja auch bei normalen Konstruktor oder Funktionsaufrufen erlauben; da sehe ich das aber nicht, oder irre ich mich?
XML/JSON in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: struct C(++) - Syntax Frage

Beitrag von kaiserludi »

Das gibts bei enums ebenfalls und zwar erst seit C99 und C++11. Vorher wars auch da nicht erlaubt.
Bei Konstruktor Initializer Listen kann man das Ganze lösen, indem man das Komma an den Zeilenanfang statt an das Zeilenende packt:

Code: Alles auswählen

Foo::Foo(int param0, float param1, bool param2)
: var0(param0)
, var1(param1)
, var2(param2)
{
}
Warum das Erlauben eines extra Kommas am Ende nicht auch in Initializer Listen und bei den Parameterlisten von Funktionen eingeführt wurde, kann ich dir nicht sagen. Vielleicht wars dort bisher einfach niemandem wichtig genug.

Die Frage gilt aber für deine Argumentation genauso:
Warum nicht auch in Initializer Listen und bei den Parameterlisten von Funktionen damit schlechten Programmierern helfen, Code zu generieren?
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
Jonathan
Establishment
Beiträge: 1959
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: struct C(++) - Syntax Frage

Beitrag von Jonathan »

kaiserludi hat geschrieben: 26.01.2022, 19:08 Bei Konstruktor Initializer Listen kann man das Ganze lösen, indem man das Komma an den Zeilenanfang statt an das Zeilenende packt:
Naja, da ist dann aber die erste Zeile anders als alle anderen, vorher war es die letzte, man hat also nichts gewonnen?

Aus praktischer Erfahrung muss ich sagen, dass dieses umsortieren öfter vorkommt, als man meinen mag. Vielleicht hat man eine Funktion geändert und muss jetzt bei jedem Aufruf die Parameter umsortieren, oder man hat einen Format-String, oder oder oder. Ich mach das immer gerne mit der Maus (markieren und ziehen) und es ist echt nervig wenn man danach die Komma wieder richtig rücken muss. Es ist echt eine total unwichtige Kleinigkeit, aber wenn es halt nix kostet das zu unterstützen, kann man es ja ruhig auch erlauben.
Lieber dumm fragen, als dumm bleiben!
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 455
Registriert: 05.07.2003, 11:17

Re: struct C(++) - Syntax Frage

Beitrag von Lord Delvin »

kaiserludi hat geschrieben: 26.01.2022, 19:08 Die Frage gilt aber für deine Argumentation genauso:
Warum nicht auch in Initializer Listen und bei den Parameterlisten von Funktionen damit schlechten Programmierern helfen, Code zu generieren?
Tatsächlich ist meine Erfahrung, dass man selten Aufrufe generiert, die leer sein *könnten*. Das ist bei der Generierung von Typen und Initialisierung in der Regel anders.
Wir können uns aber gerne darauf einigen, dass beides Spekulation ist ;)
XML/JSON in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Antworten