C Construct an unnamed object in-place?

Lesenswert?
• ▲
▼
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.
Lesenswert?
• ▲
▼
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.
1
    struct child {int foo;};
2
    struct child &&cp = {3};

Oliver
Persönliche Seite
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
John schrieb:
> struct child {...};
> struct child * cp = &{...};

natürlich geht es mit C.  Und im Prinzip genauso wie du es in der Frage 
formulierst.
1
   struct child {
2
      int a;
3
      int b;
4
      int c;
5
   };
6

7
   struct child* cp = &((struct child){ .a = 1, .b = 2, .c = 3 });
8

9
   printf ("%d\n", cp->c);


"compound literals" heißt das Ding.
Gast
Lesenswert?
• ▲
▼
Der Compiler meckert nicht!
1
#include <stdint.h>
2

3
struct inRAM{
4
    int16_t variable;
5
    const struct inFLASH __flash * ptr;
6
};
7

8
struct inFLASH{
9
    const int16_t constant;
10
    const char __flash * string;
11
};
12

13
struct inRAM array[] = {
14
    {-11, &(const struct inFLASH __flash){42, (const __flash char[]){"world"}}},
15
};
Gast
Lesenswert?
• ▲
▼
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.
Persönliche Seite
Lesenswert?
• ▲
▼
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
1
struct child cp = { .a = 1, .b = 2, .c = 3 };
2
   printf ("%d\n", (&c)->c);
ist halt marginal. Ein Äquivalent zur "new" Expression gibt es nicht, 
außer vielleicht einer lustigen Konstruktion mit Makros...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.