C Construct an unnamed object in-place?

#6902529
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.
#6902574
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 #6902578
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 #6902738
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 #6902764
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 #6902828
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 #6902833
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren