2009-12-11 8 views
5

私は、構造体があります。化合物リテラルに匿名ユニオンを割り当てることは可能ですか?

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

まあ、それはです:gccが私のようないくつかの警告を与える

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

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

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

をコンパイラーが曖昧な型に値を代入するだけでは不安であることを明確にしてください。しかし、私はより正確に指定しようとした場合でも:

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

は私が手:

error: unknown field ‘i’ specified in initializer 

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

答えて

7

匿名組合は標準Cではありません - コンパイラ拡張です。組合に名前を付けることを強くお勧めします。匿名組合を使う、という場合は、その後、あなたはそれだけの最初の要素の初期化子与えることができます:-Wall -Wextra -pedanticしてコンパイルする場合

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

を、gccのは私にある「初期化子周りにカッコの欠落」警告を与えました有効な警告。今、これが唯一の「ISO Cは無名の構造体/共用体をサポートしていません」という警告を与える

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

:初期化子が実際にこのように指定する必要があります。

あなたが組合に名前を付けるならば、あなたは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}を使用しようとした構文が無効です。指定されたイニシャライザを使用しようとしていたようです。

+0

最初に私が見たのは驚きましたが、実際には合法的な(ただし廃止されていますが)初期化構文がGCCです。 – ephemient

+0

私はいくつかのカーネルモジュールのコードを読むことから得た(私は廃止されたと推測される)初期化構文.. 'fops'構造はしばしばそのように書かれている。私は今C99の方法に切り替えます。匿名の組合についてはあまりにも悪いですが、私はそれらが標準ではないことを知らなかった、私のためにそれをクリアしてくれてありがとう。 – Steve

関連する問題