Що означає точка (.) У ініціалізаторі структури?


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

Я не добре розумію цей синтаксис С. Я навіть не можу шукати, бо не знаю назви синтаксису. Що це?


Це схоже на ініціалізатор структури.
Містичний

7
Стандартизований на C99, тому не буде працювати, якщо у вас є (дійсно) старий компілятор.
Якийсь програміст чувак

2
Нарешті знайшов посилання на цей: stackoverflow.com/questions/330793 / ...
Mysticial

5
На жаль, навіть поточні версії MSVC є "(справді) старими компіляторами" за цим стандартом.
Джонатан Леффлер

Абсолютно химерно, я шукав це питання, проходячи також підручник із запобіжниками, і писав той самий ініціалізатор.
Кіган Джей

Відповіді:


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, лише дивлячись на документацію. Ось документація cppreference.com для C (працює з C99): en.cppreference.com/w/c/language/struct_initialization та для C ++ (працює лише для C ++ 20): en.cppreference.com/w/cpp / мова / агрегат_ініціалізація .
Габріель

Зауважте, що я щойно спробував цю форму типу "крапка в точці" для C ++ за допомогою gcc, і, здається, всі версії gcc C ++ підтримують її, тому, я думаю, що вона підтримується gcc як розширення gcc, тобто перед C ++ 20 I підозрюйте, що він не переноситься обов'язково для компіляторів, які не є 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ідентифікатором " ".


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.