点(。)在结构初始化程序中是什么意思?


117
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

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


它看起来像一个结构初始化程序。
Mysticial 2011年

7
在C99中标准化,因此如果您使用的(真的)旧的编译器,将无法使用。
一些程序员伙计

2
终于找到了链接,这样的:stackoverflow.com/questions/330793/...
Mysticial

5
不幸的是,按此标准,即使是最新版本的MSVC都是“(真的)旧编译器”。
乔纳森·勒夫勒

绝对奇怪,我在阅读了保险丝教程的同时搜索了这个问题,并编写了完全相同的初始化程序。
Keegan Jay

Answers:


141

这是一项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 ++中使用吗?(我需要对其进行测试)
加布里埃尔·斯台普斯

1
看起来确实如此,但仅针对C ++ 20,只需查看文档即可。这是C的cppreference.com文档(自C99起可用):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支持C ++,我也可以使用它。
加布里埃尔·斯台普斯

点初始化可能存在陷阱(至少对于某些编译器而言)。struct demo_s demo = { .first = 1, .first = 9 };在我GCC之一,这将编译没有警告,并首次将9
雷纳特


15

其称为designated initialisation(请参阅“ 指定的初始化程序”)。一个“ initializer-list”,每个“ .”是一个“ designator”,在这种情况下,它命名“ fuse_oprations”结构的特定成员以初始化由“ hello_oper”标识符指定的对象。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.