それは文字通りの化合物で、匿名組合を割り当てるために(法的な)ことは可能ですか?

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

質問

私は、構造体を持っています:

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

私は次のように、複合リテラルを代入しようとすると:

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

gccのは私のようないくつかの警告を与えます

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

まあ、それはコンパイラが、私はちょうど多分曖昧な型に値を割り当てるわからないことは明らかです。しかし、私はより正確に指定しようとした場合でもます:

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

私が入手ます:

error: unknown field ‘i’ specified in initializer

私は(union <union name>)i:を置くならば、それが動作ことを読みました。しかし、私は、匿名組合を持つことを好みます。それを行うための方法はありますか?

役に立ちましたか?

解決

匿名組合は、標準のCではありません - 彼らは、コンパイラの拡張機能です。私は強く組合に名前を与えることをお勧めします。

:あなたは、匿名組合を使う、という場合は、それだけの最初の要素の初期化子を与えることができます
node n0 = {1, 0};  // initializes `s' to 0
-Wall -Wextra -pedanticしてコンパイルすると、

、gccが私に有効な警告である「初期化子周りにカッコの欠落」警告を与えました。初期化子は、実際にこのように指定する必要があります:

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

さて、これが唯一の「ISO Cは無名の構造体/共用体をサポートしていません」という警告を与えます。

:あなたが組合に名前を付ける場合は、

、あなたは労働組合の特定のメンバーを初期化するために呼ばれるC99機能の指定された初期化子を使用することができます

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

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

あなたは名前を持っている労働組合を必要とします。そうでない場合、コンパイラは内部の指定イニシャライザに文句を言うでしょう。

あなたはnode n0 = {type: 1, i: 4}を使用しようとしていた構文が無効な構文です。あなたが指定された初期化子を使用しようとしていたように見えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top