为什么在结构初始化期间使用点运算符?

时间:2012-12-21 05:54:24

标签: c struct

  

可能重复:
  What does dot (.) mean in a struct initializer?
  What does [ N ... M ] mean in C aggregate initializers?

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?

2 个答案:

答案 0 :(得分:6)

这些被称为指定的初始化器(在C99中添加)。它们允许您根据成员名称而不是结构中的位置指定初始值设定项。如果你想初始化一些成员而不是其他成员(并且那些你不关心初始化的成员不是全部都在结构的末尾),可以很方便。

答案 1 :(得分: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将保持未初始化状态,因为字段的顺序已更改!

当您指定字段名称时,即使字段的顺序或数量稍后更改,您也知道正确的字段已初始化。