Что означает точка (.) В инициализаторе структуры?

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

Я плохо понимаю этот синтаксис C. Я даже не могу искать, потому что не знаю названия синтаксиса. Что это такое?

Вениамин
источник
Похоже на инициализатор структуры.
Mysticial
7
Стандартизирован в C99, поэтому не будет работать, если у вас (действительно) старый компилятор.
Какой-то чувак-программист
2
Наконец, нашел ссылку для этого: stackoverflow.com/questions/330793/…
Mysticial
5
К сожалению, даже текущие версии MSVC являются «(действительно) старыми компиляторами» по этому стандарту.
Джонатан Леффлер
Совершенно странно, я искал этот вопрос, одновременно просматривая учебник по плавким предохранителям и записывая тот же самый инициализатор.
Киган Джей

Ответы:

142

Это функция 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, просто взглянув на документацию. Вот документация cppreference.com для C (работает с C99): en.cppreference.com/w/c/language/struct_initialization , а для C ++ (работает только для C ++ 20): en.cppreference.com/w/cpp / язык / aggregate_initialization .
Габриэль Стейплс,
Обратите внимание, что я только что попробовал эту форму типа «инициализация точки» для C ++ с использованием gcc, и оказалось, что все версии gcc C ++ поддерживают ее, поэтому держу пари, что она поддерживается gcc как расширение gcc, что означает, что до C ++ 20 я подозреваю, что он не обязательно переносится на компиляторы, отличные от gcc / g ++. При этом, однако, я использую компиляторы gcc / g ++, поэтому, если он поддерживается gcc для C ++, я мог бы также использовать его.
Габриэль Стейплс
В инициализации точки есть потенциальная ошибка (по крайней мере, с некоторыми компиляторами). struct demo_s demo = { .first = 1, .first = 9 };На одном из моих GCC это будет компилироваться без предупреждения, и сначала будет 9.
Renate
15

Он известен как designated initialisation(см. Назначенные инициализаторы ). «Список-инициализаторов», Каждый ' .' - это " designator", который в этом случае называет конкретный член структуры ' fuse_oprations' для инициализации для объекта, обозначенного hello_operидентификатором ' '.

COD3BOY
источник
0

Весь синтаксис известен как назначенный инициализатор, как уже упоминалось COD3BOY, и обычно используется, когда вам нужно инициализировать вашу структуру во время объявления некоторыми конкретными значениями или значениями по умолчанию.

ind79ra
источник