Question

J'ai un struct:

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

Lorsque je tente d'assigner un littéral composé, comme:

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

gcc me donne des avertissements tels que:

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

Eh bien, il est clair que le compilateur n'est pas sûr de moi simplement d'attribuer une valeur à un type peut-être ambiguë. Cependant, même si je tente de définir plus précisément:

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

Je reçois:

error: unknown field ‘i’ specified in initializer

J'ai lu que si je mets (union <union name>) avant i: il peut fonctionner. Cependant, je préfère avoir une union anonyme. Est-il possible de le faire?

Était-ce utile?

La solution

syndicats anonymes ne sont pas la norme C - ils sont une extension du compilateur. Je recommande vivement de l'union un nom. Si vous insistez sur l'utilisation d'une union anonyme, alors vous ne pouvez donner un initialiseur pour le premier élément de celui-ci:

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

Lorsque compilé avec -Wall -Wextra -pedantic, gcc m'a donné l'avertissement « accolades manquantes autour initialiseur », qui est un avertissement valide. Le initialiseur doit effectivement être spécifié comme ceci:

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

Maintenant, cela donne seulement un avertissement que « ISO C ne supporte pas les anonymes / structs syndicats ».

Si vous donnez l'union un nom, vous pouvez utiliser une fonction de C99 appelé initialiseurs désignés pour initialiser un membre spécifique de l'union:

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

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

Vous avez besoin du syndicat d'avoir un nom; sinon, le compilateur se plaindra de l'initialiseur désigné à l'intérieur.

La syntaxe que vous essayez d'utiliser node n0 = {type: 1, i: 4} est une syntaxe incorrecte; il semble que vous essayez d'utiliser initialiseurs désignés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top