私は、この組合を持っている:ユニオンのメンバーイニシャライザリストで複数の重複フィールドを初期化することはできますか?
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をターゲットにする可能性があります。私はそれが奇妙でエキゾチックなプラットフォームでは表示されないことをかなり保証することができます。もちろん
、私はちょうど全体の問題を回避し、コンストラクタの体、(または私は警告を無効にすることができます)にa
、b
、c
とd
を設定することができますが、それは私が好奇心旺盛です。
ない、それ自体は答えたが、そのツールは、それは、この特定の場合にはOKだ知っているようにするには、noディレクティブ(プラグマか何か)がありませんか? – Amit
[gcc-5.1は拒否しました](http://ideone.com/15OaqR) – PcAF
@Amit、この特定の問題の回避策はありません。 :) 1つあります、はい。 – zneak