2016-07-18 4 views
6

私は、この組合を持っている:ユニオンのメンバーイニシャライザリストで複数の重複フィールドを初期化することはできますか?

union Foo 
{ 
    uint32_t u32; 
    struct 
    { 
     uint32_t a : 10; 
     uint32_t b : 10; 
     uint32_t c : 10; 
     uint32_t d : 2; 
    }; 

    Foo() : a(0), b(1), c(2), d(3) 
    { 
    } 
}; 

我々は潜在的なバグのためのC++のコードを解析して、それは私がこれを書いたときにu32が初期化されていないと考えているところ、それは偽陽性を持っているツールを持っています。

私はVC++は、私はこのメンバー初期化子リストを書くようになることがわかった。

Foo() : u32(0), a(0), b(1), c(2), d(3) 

それはツールを黙らんが、それは...激しく怪しげに見えます。 (コメントに基づいて編集する:GCCとClangはそれを受け入れないので大いに疑わしいと思われる。)

構造体の場合、構造体ではメンバー初期化子が定義順に実行されます。組合にも同様のものがありますが、u32(0)のためにこれがゼロにならないことを保証していますか?

私たちは、移植性の大きな偽装はありません。今、このプロジェクトはWindowsをターゲットにしていますが、今後はiOSとAndroidをターゲットにする可能性があります。私はそれが奇妙でエキゾチックなプラットフォームでは表示されないことをかなり保証することができます。もちろん

、私はちょうど全体の問題を回避し、コンストラクタの体、(または私は警告を無効にすることができます)にabcdを設定することができますが、それは私が好奇心旺盛です。

+0

ない、それ自体は答えたが、そのツールは、それは、この特定の場合にはOKだ知っているようにするには、noディレクティブ(プラグマか何か)がありませんか? – Amit

+0

[gcc-5.1は拒否しました](http://ideone.com/15OaqR) – PcAF

+0

@Amit、この特定の問題の回避策はありません。 :) 1つあります、はい。 – zneak

答えて

5

n4594

12.6.2 /§? (§9の下):

[注:[...] -endノート] への試みは、労働組合の複数の非静的データメンバが病気に形成されたプログラムをレンダリングする初期化します。 [注:[...] -endノート]