-2

重複の可能性:
構造体初期化子でドット(。)はどういう意味ですか?
C集約初期化子で[N...M]はどういう意味ですか?

struct confd_data_cbs    ssd_shdiag_callback = {
    .callpoint  = show_diag__callpointid_diag_cp,
    .get_object = ssd_common_get_object,
    .get_next   = ssd_common_get_next,
};

.callback、.get_object、.get_next?

4

2 に答える 2

6

これらは指定イニシャライザと呼ばれます (C99 で追加)。構造内の位置ではなく、メンバー名に基づいて初期化子を指定できます。一部のメンバーを初期化し、他のメンバーを初期化しない場合に便利です (初期化を気にしないメンバーは構造体の最後にあるわけではありません)。

于 2012-12-21T05:57:32.103 に答える
3

これは、明確にするためと将来の互換性のために行われます。

構造がある場合:

struct confd_data_cbs  {
    TypeA callpoint;
    TypeB get_object;
    TypeC get_next;
};

しかし、ある時点で、後で次のように定義を変更します。

struct confd_data_cbs  {
    TypeA callpoint;
    TypeD set_object;   /* New Field Added */
    TypeB get_object;
    TypeC get_next;
};

そうすると、フィールド名を指定しない初期化子は機能しなくなります。
ssd_common_get_objectに割り当てられset_objectget_nextフィールドの順序が変更されたため、初期化されないままになります。

フィールド名を指定すると、フィールドの順序や数が後で変更された場合でも、適切なフィールドが初期化されていることがわかります。

于 2012-12-21T06:00:50.010 に答える