dot (.) หมายถึงอะไรในตัวเริ่มต้นโครงสร้าง


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

ฉันไม่เข้าใจไวยากรณ์ C นี้ดี ฉันค้นหาไม่ได้ด้วยซ้ำเพราะฉันไม่รู้ชื่อไวยากรณ์ นั่นอะไร?


ดูเหมือนว่า Struct initializer
Mysticial

7
เป็นมาตรฐานใน C99 ดังนั้นจะไม่ทำงานหากคุณมีคอมไพเลอร์เก่า (จริงๆ)
โปรแกรมเมอร์บางคนเข้ามา

2
ในที่สุดก็พบลิงค์สำหรับสิ่งนี้: stackoverflow.com/questions/330793/…
Mysticial

5
น่าเสียดายที่แม้แต่ MSVC เวอร์ชันปัจจุบันยังเป็น 'คอมไพเลอร์เก่า' ตามมาตรฐานนี้
Jonathan Leffler

แปลกมากฉันค้นหาคำถามนี้ในขณะที่กำลังอ่านบทแนะนำเกี่ยวกับฟิวส์และเขียนตัวเริ่มต้นเดียวกันนั้น
Keegan Jay

คำตอบ:


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 ++ ด้วยหรือไม่? (ฉันต้องการทดสอบ)
Gabriel Staples

1
ปรากฏว่ามันทำได้ แต่เฉพาะสำหรับ C ++ 20 เพียงแค่ดูเอกสาร นี่คือเอกสาร cppreference.com สำหรับ C (ใช้ได้ตั้งแต่ C99): en.cppreference.com/w/c/language/struct_initializationและสำหรับ C ++ (ใช้ได้กับ C ++ 20 เท่านั้น): en.cppreference.com/w/cpp /
Gabriel Staples

โปรดทราบว่าฉันเพิ่งลองใช้แบบฟอร์ม "dot initialization" สำหรับ C ++ โดยใช้ gcc และดูเหมือนว่า gcc C ++ ทุกเวอร์ชันรองรับดังนั้นฉันจึงพนันได้เลยว่า gcc รองรับเป็นส่วนขยาย gcc ซึ่งหมายความว่าก่อน C ++ 20 I สงสัยว่ามันไม่สามารถพกพาได้สำหรับคอมไพเลอร์ที่ไม่ใช่ gcc / g ++ ดังที่กล่าวไว้ว่าฉันใช้คอมไพเลอร์ gcc / g ++ ดังนั้นหาก gcc สำหรับ C ++ รองรับฉันก็อาจใช้มันเช่นกัน
Gabriel Staples

มี gotcha ที่เป็นไปได้ในการเริ่มต้น dot (อย่างน้อยก็มีคอมไพเลอร์บางตัว) struct demo_s demo = { .first = 1, .first = 9 };ที่หนึ่งของ GCC ของฉันนี้จะรวบรวมโดยไม่มีการเตือนและเป็นครั้งแรกจะเป็น 9
Renate


15

เรียกว่าdesignated initialisation(ดูตัวเริ่มต้นที่กำหนด ) "initializer-list", Each ' .' คือ " designator" ซึ่งในกรณีนี้จะตั้งชื่อสมาชิกเฉพาะของโครงสร้าง ' fuse_oprations' เพื่อเริ่มต้นสำหรับอ็อบเจ็กต์ที่กำหนดโดยhello_operตัวระบุ ''


0

ไวยากรณ์ทั้งหมดเรียกว่า initializer ที่กำหนดตามที่ COD3BOY กล่าวไว้แล้วและจะใช้โดยทั่วไปเมื่อคุณต้องการเริ่มต้นโครงสร้างของคุณในเวลาที่ประกาศเป็นค่าเฉพาะหรือค่าเริ่มต้นบางค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.