Dấu chấm (.) Có nghĩa là gì trong trình khởi tạo cấu trúc?


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

Tôi không hiểu rõ cú pháp C này. Tôi thậm chí không thể tìm kiếm vì tôi không biết tên cú pháp. Cái gì vậy?


Nó trông giống như một trình khởi tạo cấu trúc.
Mysticial

7
Được chuẩn hóa trong C99, vì vậy sẽ không hoạt động nếu bạn có một trình biên dịch (thực sự) cũ.
Một số lập trình viên dude

2
Cuối cùng đã tìm thấy liên kết cho điều này: stackoverflow.com/questions/330793/…
Mysticial

5
Thật không may, ngay cả các phiên bản hiện tại của MSVC là '(thực sự) các trình biên dịch cũ' theo tiêu chuẩn này.
Jonathan Leffler

Hoàn toàn kỳ lạ, tôi đã tìm kiếm câu hỏi này trong khi cũng đang xem qua hướng dẫn cầu chì và viết bộ khởi tạo chính xác đó.
Keegan Jay

Câu trả lời:


141

Đây là một tính năng của C99 cho phép bạn đặt các trường cụ thể của cấu trúc theo tên trong trình khởi tạo. Trước đó, trình khởi tạo chỉ cần chứa các giá trị, cho tất cả các trường, theo thứ tự - tất nhiên vẫn hoạt động.

Vì vậy, đối với cấu trúc sau:

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

...bạn có thể dùng

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

...hoặc là:

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

... hoặc thậm chí:

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

... mặc dù hai chiếc cuối cùng chỉ dành cho C99.


Khởi tạo dấu chấm có hoạt động trong C ++ không? (Tôi cần kiểm tra nó)
Gabriel Staples

1
Có vẻ như nó làm được, nhưng chỉ đối với C ++ 20, chỉ cần xem tài liệu. Đây là tài liệu cppreference.com cho C (hoạt động từ C99): en.cppreference.com/w/c/language/struct_initialization và cho C ++ (chỉ hoạt động với C ++ 20): en.cppreference.com/w/cpp / language / integration_initialization .
Gabriel Staples

Lưu ý rằng tôi vừa thử biểu mẫu loại "khởi tạo dấu chấm" này cho C ++ bằng cách sử dụng gcc và có vẻ như tất cả các phiên bản của gcc C ++ đều hỗ trợ nó, vì vậy tôi đặt cược rằng nó được hỗ trợ bởi gcc dưới dạng phần mở rộng gcc, nghĩa là trước C ++ 20 I nghi ngờ rằng nó không nhất thiết phải di động đối với các trình biên dịch không phải gcc / g ++. Tuy nhiên, điều đó đang được nói, tôi đang sử dụng trình biên dịch gcc / g ++ vì vậy nếu nó được hỗ trợ bởi gcc cho C ++, tôi cũng có thể sử dụng nó.
Gabriel Staples

Có một gotcha tiềm năng trong khởi tạo dot (ít nhất là với một số trình biên dịch). struct demo_s demo = { .first = 1, .first = 9 };Trên một trong những GCC của tôi, điều này sẽ biên dịch mà không có cảnh báo và đầu tiên sẽ là 9.
Renate


15

Nó được gọi là designated initialisation(xem Bộ khởi tạo được chỉ định ). Một "danh sách khởi tạo", Mỗi ' .' là một " designator" trong trường hợp này đặt tên cho một thành viên cụ thể của fuse_oprationscấu trúc '' để khởi tạo cho đối tượng được chỉ định bởi mã hello_operđịnh danh ''.


0

Toàn bộ cú pháp được gọi là bộ khởi tạo được chỉ định như đã được COD3BOY đề cập và nó được sử dụng nói chung khi bạn cần khởi tạo cấu trúc của mình tại thời điểm khai báo thành một số giá trị cụ thể hoặc mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.