memsetは行く方法です。選択肢があまりありません。
次のようにします:
#define InitStruct(var, type) type var; memset(&var, 0, sizeof(type))
そうすれば、次のことを行うだけです:
InitStruct(st, BigStruct);
そして、通常どおり st を使用します...
「0」が構造体の有効な「0」タイプではない理由がわかりません。構造体を「一括初期化」する唯一の方法は、すべてのメモリを値に設定することです。そうしないと、メンバーごとに特定のビット パターンを使用するように指示する追加のロジックを作成する必要があります。使用する最適な「一般的な」ビット パターンは 0 です。
その上、これはあなたが行ったときに使用したのと同じロジックです
*(controller->bigstruct) = *( struct bigstruct ){ 0 };
したがって、私はあなたがそれを使用するのをためらうわけではありません:)
この投稿への最初のコメントは、私が彼とばかを呼ぶ前に、私にいくつかの調査をさせました.そして、私はこれを見つけました:
http://www.lysator.liu.se/c/c-faq/c-1.html
とても興味深い;もし私がコメントに賛成票を投じることができたら、私はそうします:)
そうは言っても、0 以外の null 値を持つ古いアーキテクチャをターゲットにしたい場合の唯一のオプションは、特定のメンバーを手動で初期化することです.
ありがとう、トーマス・パドロン・マッカーシー!今日は新しいことを学びました:)
memset を使用したくない場合は、いつでも構造体の静的コピーを宣言して memcpy を使用できます。これにより、同様のパフォーマンスが得られます。これにより、プログラムに 4 MB が追加されますが、個々の要素を設定するよりもおそらく優れています。
とはいえ、GCC が memset を使用していて、以前はそれで十分だったのであれば、今でも十分に優れていることをお勧めします。
プライベートな初期化関数は醜いものではなく、オブジェクト (構造体) を初期化する良いオブジェクト指向の方法です。あなたの構造は 4MB のポインターではないと仮定するので、解決策は次のようになると思います:
void init_big_struct(struct bigstruct *s)
{
memset(s, 0, sizeof(struct bigstruct));
s->some_pointer = NULL; // Multiply this as needed
}
一方、私たちのコードは 20 を超える組み込みオペレーティング システムと多数の異なるハードウェアで実行されていますが、構造体の memset だけで問題が発生することはありません。