【问题标题】:Why using dot operator during initialization of a structure? [duplicate]为什么在结构初始化期间使用点运算符? [复制]
【发布时间】:2012-12-08 17:28:09
【问题描述】:

可能重复:
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?

【问题讨论】:

    标签: c struct


    【解决方案1】:

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

    【讨论】:

    • 使用名称初始化和使用位置初始化有什么区别。何时何地使用?
    • @user1160090:即使字段的数量/顺序可能发生变化,使用名称也可以确保值到达预期的字段。如果你只关心 C 和支持它的编译器,我大部分时间都会使用指定的初始化程序。
    • 感谢 Jerry 的支持
    【解决方案2】:

    这样做是为了清晰和未来的兼容性。

    如果你有结构:

    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_object,而 get_next 将保持未初始化状态,因为字段的顺序已更改!

    当您指定字段名称时,您知道正确的字段正在初始化,即使字段的顺序或数量稍后发生变化。

    【讨论】:

    • 感谢 @abelenky 的支持
    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2011-03-11
    • 2020-12-04
    • 2021-10-23
    • 2021-06-17
    • 2016-02-22
    相关资源
    最近更新 更多