2016-09-05 5 views
3

つのフィールドを除いてゼロに構造体を初期化します。 加えて、私はつまり、私はそのような何かをしたくないん、私はそれを宣言するところ初期化が行われるようにしたい:には、以下の構造体を考慮

sampleStruct globalStruct = {0}; 

int someFunc() 
{ 
    //... 
    globalStruct.b = true; 
    //... 
} 

これを行う方法はありますか? 私はそのような何かをやって考えた:

sampleStruct globalStruct = {.b = true, 0}; 

はそれを他のすべてのフィールドは常にゼロであることを約束していますか?

+0

注:アンダースコアで始まる名前は、すべての名前空間の実装用に予約されています。アプリケーションコードでそれらを使用しないでください! – Olaf

+4

@Olaf先頭に1つのアンダースコアが付いたシンボルは、グローバルスコープ内にのみ予約されています(したがって、通常の構造体定義では使用できません)。二重(またはそれ以上)のアンダースコアのシンボル、またはアンダースコアと大文字の後のシンボルは、すべてのスコープで予約されています。 –

+0

@ JoachimPileborg:私は分化したはずです。とにかく 'typedef'は一般的にファイルスコープです。だから、これはここに当てはまるでしょう。しかし、はい、OPは[mcve]を提供しないので、**はブロックスコープにある可能性があります**。 – Olaf

答えて

6

他のすべてのフィールドが常にゼロであることを約束しますか?

はい。明示的に初期化されていないメンバーは、指定された初期化子の一部としてゼロに初期化されます。そこには0も必要ありません。これは:

sampleStruct globalStruct = {.b = true}; 

で十分です。

+1

正確ではありません。 '0'(整数)、' 0.0'(浮動小数点数)、_null pointer_に設定されています。整数を除いて、必ずしもゼロビットを意味するわけではありません。そしてそれは指定された初期化子に関連していません。 'b'が最初のフィールドであるので、イニシャライザ' {true} 'も同じように動作します。指定されたイニシャライザーは、はっきりしています。 – Olaf

+5

どこから読んでいますか?私の答えは、*ゼロは初期化されているとしか言いません。 – usr

+0

ポインタで "ゼロ"を持つ他の意味は何ですか? – Olaf

2

はい、これはC11 6.7.9によって保証さ/ 21:

、要素又は集合体のメンバー、またはより少ない文字であるよりも、中括弧で囲まれたリスト内の少ない初期化子が存在する場合 よりも既知のサイズの配列を初期化するために使用される文字列リテラルは、配列内の要素であるため、 は、静的記憶域を持つオブジェクトと同じに暗黙的に初期化されます。 duration。

"集約"は、標準的な小柄な意味です:配列または構造体または共用体です。単純な単一値変数( "スカラー")とは対照的に。

上記において、「静的記憶期間があるかのように初期化」とは、(6.7。9/10):

静的またはスレッド貯蔵期間を持つオブジェクトが 初期化されていない場合、明示的に、その後:
- それはポインタ型を有する場合、それは ヌルポインタに初期化されます。
- 算術型の場合は、 (正または符号なし)のゼロに初期化されます。
- 集合体の場合、すべてのメンバーはこれらの規則に従って(再帰的に)初期化されたであり、すべてのパディングは0ビットに初期化された です。
- 共用体の場合、最初の名前付きメンバ はこれらの規則に従って(再帰的に)初期化され、すべての埋め込み はゼロビットに初期化されます。

これは、イニシャライザリストのすべての初期化子に適用されます。指定されたイニシャライザは例外でも特別なケースでもありません。

関連する問題