構造体の配列の最後に空の中括弧「{}」の必要性は何ですか?

NK細胞:

私はいくつかのヒット コードを Linuxカーネルに:

static struct ctl_table ip_ct_sysctl_table[] = {
    {
        .procname   = "ip_conntrack_max",
        .maxlen     = sizeof(int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec,
    },
    // ...
    {
        .procname   = "ip_conntrack_log_invalid",
        .maxlen     = sizeof(unsigned int),
        .mode       = 0644,
        .proc_handler   = proc_dointvec_minmax,
        .extra1     = &log_invalid_proto_min,
        .extra2     = &log_invalid_proto_max,
    },
    { }
};

ここでは構造体の配列は、で終わります{ }どのような目的のためにそれを追加しましたか?
ところで、このコード上のビットは、他の存在する構造体の配列が、最後に空の括弧なしで、。

とき私は、構造体の配列の最後に空の括弧を使用する必要がありますか?

dfri:

この特定の変更は、の一部であったのsysctlネット:未使用のsysctlバイナリコードを削除する最後の要素の初期変化、エリックW. Biedermanによってコミットip_ct_sysctl_tableからアレイ{0}{}(および実行多くの他の配列の初期化と同様の変更を)。

{0}パターンは、はるかに長いけれども出回っているようだ、との両方{0}又は{}最終要素初期化が明示的と呼ばれる(Linuxのソースコードで)一般的でありTerminating entry、それはそれらの長さを知らずにこれらの配列を消費することを可能にするパターンの存在がそうであるように、ゼロ初期化終了のエントリを打つときの消費を終了します。で同様の配列のための例えばsound/aoa/fabrics/snd-aoa-fabric-layout.cゼロ初期化の意図にも明示的にコメントに記載されている、例えば:

static struct codec_connection toonie_connections[] = {
  {
      .connected = CC_SPEAKERS | CC_HEADPHONE,
      .codec_bit = 0,
  },
  {} /* terminate array by .connected == 0 */
};

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=30415&siteId=1