Forum: Compiler & IDEs #define G_VALUE_INIT { 0, { { 0 } } }


von Stefan (Gast)


Lesenswert?

1
#define G_VALUE_INIT  { 0, { { 0 } } }
2
3
typedef struct {
4
} GValue;
5
6
GValue value = G_VALUE_INIT;

https://developer.gnome.org/gobject/stable/gobject-Generic-values.html#G-VALUE-INIT:CAPS

Ich rätsel gerade etwas. Ein leeres Struct, size wäre ja wohl Null -- 
was macht dann dieses Macro G_VALUE_INIT. Ich denke ein Stichwort reicht 
mir schon, damit ich es nachlesen kann...

von Bitflüsterer (Gast)


Lesenswert?

Den typedef hast Du wahrscheinlich genau von der verlinkten Seite - ein 
Abschnitt darunter.

Lies mal den Text dazu. Die genaue interne Struktur wird in der 
Dokumentation absichtlich nicht beschrieben. Zu welchem Zweck, lasse ich 
hier mal offen. Das wird klarer wenn Du weiterliest und wenig darüber 
nachdenkst.
Aufgrund des DEFINES aber ist zumindest klar, dass sie nicht, wie Du 
annimmst "leer" ist und die Größe Null hat.
Wenn Du es genauer wissen wilst, dann schaue in den Quellcode.

von Stefan (Gast)


Lesenswert?

Bitflüsterer schrieb:
> Die genaue interne Struktur wird in der
> Dokumentation absichtlich nicht beschrieben.

Das ist mir schon soweit klar. Aber wenn ich in C programmiere, verwende 
ich ja nur die Header-Files. Dann ist das struct scheinbar leer, was 
macht dann das Makro. (Meist verwendet GTK ja Pointer und stellt 
irgendwelche Funktionen bereit, die das Objekt initialisieren, etwa wie 
gtk_button_new() oder so. Aber hier mit diesem Macro? Und ich denke 
schon, es soll so auch vom Anwender verwendet werden, nicht etwa nur 
intern von den GTK Entwicklern.) Ich verstehe es momentan nicht.

von Freddie (Gast)


Lesenswert?

Stefan schrieb:
> Aber wenn ich in C programmiere, verwende
> ich ja nur die Header-Files. Dann ist das struct scheinbar leer

Wieso hältst du an diesem Blödsinn fest, statt einfach mal 
nachzuschauen, obwohl dir schon gesagt wurde, daß dem nicht so ist?

Die gtype.h und gvalue.h findest du schon selbst, oder?

von Bitflüsterer (Gast)


Lesenswert?

Stefan schrieb:
> Bitflüsterer schrieb:
>> Die genaue interne Struktur wird in der
>> Dokumentation absichtlich nicht beschrieben.
>
> Das ist mir schon soweit klar.
> Aber wenn ich in C programmiere, verwende
> ich ja nur die Header-Files.
Wieso "nur"? Genau die verwendest Du. Aber nicht "nur". Sondern auch 
"C"-Files.

> Dann ist das struct scheinbar leer, ...
Der Begriff "scheinbar" ist hier nicht anwendbar. Entweder ist eine 
Struktur leer oder sie ist es nicht.

> ... was
> macht dann das Makro.
Der Schluss geht so: Das Makro hat nur dann einen Sinn, wenn die 
Struktur nicht leer ist. Ergo, ist die Struktur nicht leer. Genaueres 
sehe ich dann in dem Header-File.

von Salewski, Stefan (Gast)


Lesenswert?

OK, verstanden.
1
typedef struct {
2
} GValue;

steht tatsächlich nur in der Dokumentation so da, in gvalue.h steht 
tatsächlich
1
struct _GValue
2
{
3
  /*< private >*/
4
  GType    g_type;
5
6
  /* public for GTypeValueTable methods */
7
  union {
8
    gint  v_int;
9
    guint  v_uint;
10
    glong  v_long;
11
    gulong  v_ulong;
12
    gint64      v_int64;
13
    guint64     v_uint64;
14
    gfloat  v_float;
15
    gdouble  v_double;
16
    gpointer  v_pointer;
17
  } data[2];
18
};

Und in gtype.h dann
1
typedef struct _GValue                  GValue;

Wobei das aber eher die Ausnahme für GTK3 ist, meist sind opaque Typen 
nur in den .c Dateien explizit spezifiziert, und davon war ich 
ausgegangen.

von Bitflüsterer (Gast)


Lesenswert?

> Wobei das aber eher die Ausnahme für GTK3 ist, meist sind
> opaque Typen nur in den .c Dateien explizit spezifiziert, ...
Das mag sein, was immer Du damit meinst. :-) Hier geht es um 
"Deklarationen" (oder Definitionen). Sowas wie "explizite 
Spezifikationen" gibt es in C in dieser Beziehung nicht.

> ... und davon war ich ausgegangen.
Ein böser Fehler und eigentlich nicht recht verständlich. ;-)
Versuche mal eine leere Struktur zu deklarieren und sie zu 
initialisieren. Der Compiler wird das garnicht akzeptieren. Auch die 
Syntax-Beschreibung wird klarlegen, dass mindestens ein Mitglied genannt 
werden muss.
Egal was in irgendeiner Dokumentation steht (und hier war ja 
ausdrücklich von "opaque" die Rede) - an der C-Syntax kommt das 
dazugehörige Programm niemals vorbei.

Die Schlussfolgerung wäre gewesen: In der Dokumentation steht etwas, das 
NICHT C ist. Ergo: Die Dokumentation ist - sagen wir - unvollständig. 
Aber wie schon gesagt. Das wurde hier ja auch AUSDRÜCKLICH angesagt.

Dann viel Erfolg noch.

von Eric B. (beric)


Lesenswert?

Stefan schrieb:
>
1
> #define G_VALUE_INIT  { 0, { { 0 } } }
2
> 
3
> typedef struct {
4
> } GValue;
5
> 
6
> GValue value = G_VALUE_INIT;
7
>
>
> 
https://developer.gnome.org/gobject/stable/gobject-Generic-values.html#G-VALUE-INIT:CAPS
>
> Ich rätsel gerade etwas. Ein leeres Struct, size wäre ja wohl Null

Nein. Mit dem typedef wird hier lediglich definiert, dass GValue 
irgendein struct ist. Die Struktur des structs ist woanders definiert 
und wird hier nicht preisgegeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.