Ist es möglich, (Rechts-) eine anonyme Vereinigung in einer Verbindung wörtlichen zuweisen?

StackOverflow https://stackoverflow.com/questions/1885854

Frage

Ich habe eine Struktur:

typedef struct _n
{
    int type;
    union {
        char *s;
        int i;
    };
} n;

Wenn ich versuche, eine Verbindung wörtliche zuweisen, wie:

node n1 = {1, 0};
node n2 = {2, "test"};

gcc gibt mir einige Warnungen wie:

warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

Nun, es ist klar, dass der Compiler nicht sicher ist, über ich nur Wert auf einen möglicherweise mehrdeutig Typen zuweisen. Aber auch wenn ich versuche, genauer zu spezifizieren:

node n0 = {type: 1, i: 4};

ich:

error: unknown field ‘i’ specified in initializer

Ich habe gelesen, dass wenn ich (union <union name>) vor i: setzen, dann kann es funktionieren. Allerdings ziehe ich eine anonyme Vereinigung mit. Gibt es eine Möglichkeit, es zu tun?

War es hilfreich?

Lösung

Anonyme Gewerkschaften sind nicht Standard-C - sie sind eine Compiler-Erweiterung. Ich würde empfehlen, dass die Union einen Namen geben. Wenn Sie sich mit einem anonymen bestehen, dann kann man nur einen Initialisierer für das erste Element davon geben:

node n0 = {1, 0};  // initializes `s' to 0

Wenn Sie mit -Wall -Wextra -pedantic kompiliert, gab gcc mir die Warnung „fehlenden Klammern um initializer“, die eine gültige Warnung. Die initializer sollte wie folgt tatsächlich angegeben werden:

node n0 = {1, {0}};  // initializes `s' to 0

Jetzt das gibt nur eine Warnung, dass „ISO C nicht unbenannte structs / Gewerkschaften unterstützt“.

Wenn Sie die Union einen Namen geben, dann können Sie eine C99-Funktion verwenden genannt bezeichnet initializers ein bestimmtes Mitglied der Vereinigung initialisieren:

typedef struct
{
    int type;
    union {
        char *s;
        int i;
    } value;
} node;

node n0 = {1, { .s = "string"; }};
node n1 = {2, { .i = 123; }};

Sie müssen die Union einen Namen haben; Andernfalls wird der Compiler über die bestimmte Initialisierung im Innern beschweren.

Die Syntax Sie versuchten node n0 = {type: 1, i: 4} zu verwenden ist ungültig Syntax; es sieht aus wie Sie bezeichnet initializers verwenden wollten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top