【问题标题】:What does dot (.) mean in a struct initializer?结构初始化程序中的点 (.) 是什么意思?
【发布时间】:2011-12-24 05:43:59
【问题描述】:
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

我不太了解这种 C 语法。我什至无法搜索,因为我不知道语法的名称。那是什么?

【问题讨论】:

  • 它看起来像一个结构初始化器。
  • 在 C99 中标准化,所以如果你有一个(非常)旧的编译器就不会工作。
  • 终于找到了这个链接:stackoverflow.com/questions/330793/…
  • 不幸的是,即使是当前版本的 MSVC,按照这个标准也是“(真的)旧编译器”。
  • 太奇怪了,我搜索了这个问题,同时还浏览了一个保险丝教程,并编写了完全相同的初始化程序。

标签: c c99 designated-initializer


【解决方案1】:

整个语法被称为 COD3BOY 已经提到的指定初始值设定项,它通常在您需要在声明时将结构初始化为某些特定值或默认值时使用。

【讨论】:

    【解决方案2】:

    它被称为designated initialisation(参见Designated Initializers)。一个“初始化列表”,每个 '.' 是一个 “designator”在这种情况下命名 'fuse_oprations' 结构为由指定的对象初始化 'hello_oper' 标识符。

    【讨论】:

      【解决方案3】:

      这些是 C99 的designated initializers

      【讨论】:

        【解决方案4】:

        这是一个 C99 功能,允许您在初始化程序中按名称设置结构的特定字段。在此之前,初始化程序只需要按顺序包含所有字段的值——当然,这仍然有效。

        所以对于以下结构:

        struct demo_s {
          int     first;
          int     second;
          int     third;
        };
        

        ...你可以使用

        struct demo_s demo = { 1, 2, 3 };
        

        ...或:

        struct demo_s demo = { .first = 1, .second = 2, .third = 3 };
        

        ...甚至:

        struct demo_s demo = { .first = 1, .third = 3, .second = 2 };
        

        ...虽然最后两个仅适用于 C99。

        【讨论】:

        • 点初始化在 C++ 中也有效吗? (我需要测试一下)
        • 似乎确实如此,但仅适用于C ++ 20,只需查看文档即可。以下是 C(自 C99 起工作)的 cppreference.com 文档:en.cppreference.com/w/c/language/struct_initialization,以及 C++(仅适用于 C++20):en.cppreference.com/w/cpp/language/aggregate_initialization
        • 请注意,我刚刚使用 gcc 为 C++ 尝试了这种“点初始化”类型形式,似乎所有版本的 gcc C++ 都支持它,所以我敢打赌它作为 gcc 扩展被 gcc 支持,这意味着在 C++20 之前,我怀疑它不一定可移植到非 gcc/g++ 编译器。不过话虽如此,我使用的是 gcc/g++ 编译器,所以如果 gcc for C++ 支持它,我不妨使用它。
        • 在点初始化中存在潜在的陷阱(至少对于某些编译器而言)。 struct demo_s demo = { .first = 1, .first = 9 }; 在我的一个 GCC 上,这将在没有警告的情况下编译,首先是 9。
        猜你喜欢
        • 2020-07-17
        • 2022-01-01
        • 2011-09-09
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多