Gast
#6902520
Kann man ein struct anonym initialisieren und den Zeiger darauf erhalten
(ähnlich zu string)?
struct child {...}
struct child * cp = &{...};
|
Anzeige
|
C Construct an unnamed object in-place?
Gast
#6902520
Kann man ein struct anonym initialisieren und den Zeiger darauf erhalten
(ähnlich zu string)?
struct child {...}
struct child * cp = &{...};
Du willst vielleicht C++ nehmen? In C gibt e keine Konstruktion von structs. Du kannst dir Platz mit malloc() oder calloc() schaffen (letzteres initialisiert zu Nullen immerhin) oder sonstwie und bei Bedarf eine eigene Funktion danach aufrufen, die alles zurechtbiegt. In C gar nicht, aber in C++ schon::
Danach muss man die Instanz wieder mit "delete" löschen. Besser geht das mit std::unique_ptr:
Löscht die Instanz automatisch. Den Zeiger selbst bekommst du mit cp.get(). John schrieb: > Kann man irgendeine obskure Definition/Deklaration/etc. machen? Die erste Autorität zu dem Thema ist dein Compiler. Der sagt dir schon, was er davon hält. Also frag den doch einfach. Die Antwort lautet selbstverständlich nein. Aber du solltest mal nach rvalue reference googlen. Das ist im Prinzip das, was du willst, nur mit reference statt pointer.
Oliver Oliver S. schrieb: > Die erste Autorität zu dem Thema ist dein Compiler. Eher der C- oder eben C++ -Standard. Viele Compiler haben Erweiterungen, die nicht auf andere übertragbar sind. Daher ist es sinnvoll, sich nicht einfach nur auf ausprobieren zu verlassen, sondern eben den Standard oder eine verdaulichere Fassung davon, wie ein gutes Buch, zu konsultieren.
Gast
#6902624
Ok danke. Niklas G. schrieb: > Viele Compiler haben Erweiterungen, > die nicht auf andere übertragbar sind. Nun ja, da hätte man zwei Möglichkeiten: man freut sich, daß es mit diesem einen Compiler funktioniert, oder man wählt per Compileroption diese Erweiterungen ab. Oliver
Gast
#6902738
John schrieb: > struct child {...}; > struct child * cp = &{...}; natürlich geht es mit C. Und im Prinzip genauso wie du es in der Frage formulierst.
"compound literals" heißt das Ding.
Gast
#6902764
Der Compiler meckert nicht!
Gast
#6902772
Mhh, da stimmt aber irgendwas noch nicht - ein Zeichen weniger im string spart zwei Bytes Flash!? Kann schon sein, wenn die Variable dahinter auf einer 2-Byte-Grenze liegen muß. Vor der Verkürzung des Strings gibt es ein ungenutztes Füllbyte deswegen, nach der Verkürzung braucht es das nicht und die Variable kann 2 vorrücken.
Gast
#6902790
Tatsache, noch ein Zeichen weniger, Flash bleibt gleich (bezieht sich auf avr-libc und GCC). Vielen Dank! hä? schrieb: > natürlich geht es mit C Der Zeiger ist dann aber nur bis zum Ende des umschließenden Blocks gültig. Da hätte man auch eine normale Variable nehmen können und halt & verwendet...
Gast
#6902828
Niklas G. schrieb: > hä? schrieb: >> natürlich geht es mit C > > Der Zeiger ist dann aber nur bis zum Ende des umschließenden Blocks > gültig. Da hätte man auch eine normale Variable nehmen können und halt & > verwendet... Ich bin mir nicht sicher was du sagen willst, aber dieser compound literal hat static storage duration. Sieht aus wie nen cast, verhält sich aber in nahezu jeder hinsicht anders. mh schrieb: > aber dieser compound literal hat static storage duration. Laut Cppreference nur wenn es außerhalb von Funktionen steht: https://en.cppreference.com/w/c/language/compound_literal mh schrieb: > Ich bin mir nicht sicher was du sagen willst Der Gewinn gegenüber
ist halt marginal. Ein Äquivalent zur "new" Expression gibt es nicht, außer vielleicht einer lustigen Konstruktion mit Makros... hä? schrieb: > "compound literals" heißt das Ding. Das ist aber mit Vorsicht zu genießen. Ich glaube ab C99 geht das so, aber nur in C. In C++ wäre das nur ein temporäres Objekt, das am Ende der Anweisung stirbt. Der Zeiger darauf wird damit zu russischen Roulette in C++. https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|