static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
ความหมายของ[0x3A]
ที่นี่คืออะไร? ฉันได้เรียนรู้เฉพาะข้อความเช่นint a[2] = {1, 2};
static uint8_t togglecode[256] = {
[0x3A] CAPSLOCK,
[0x45] NUMLOCK,
[0x46] SCROLLLOCK
};
ความหมายของ[0x3A]
ที่นี่คืออะไร? ฉันได้เรียนรู้เฉพาะข้อความเช่นint a[2] = {1, 2};
คำตอบ:
หมายถึงการเริ่มต้นองค์ประกอบที่nของอาร์เรย์ ตัวอย่างที่คุณให้ไว้จะหมายความว่า:
togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK
สิ่งเหล่านี้เรียกว่า"initializers ที่กำหนด"และเป็นส่วนหนึ่งของมาตรฐาน C99 อย่างไรก็ตามไวยากรณ์ที่ไม่มี=
is not จากหน้านั้น:
ไวยากรณ์ทางเลือกสำหรับการนี้ซึ่งได้รับการล้าสมัยตั้งแต่ GCC 2.5 แต่ยังคง GCC ยอมรับคือการเขียนก่อนที่จะคุ้มค่าองค์ประกอบที่ไม่มี
[index]
=
ตามเอกสาร GCCนี้เป็นไปตามมาตรฐาน ISO C99 พวกเขาเรียกมันว่า "เครื่องเริ่มต้นที่กำหนด":
ในการระบุดัชนีอาร์เรย์ให้เขียน `[index] = 'ก่อนค่าองค์ประกอบ ตัวอย่างเช่น,
int a[6] = { [4] = 29, [2] = 15 };
เทียบเท่ากับ
int a[6] = { 0, 0, 15, 0, 29, 0 };
ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อน แต่ฉันเพิ่งรวบรวมด้วย gcc 4.4.5 ด้วย -Wall รวบรวมได้สำเร็จและไม่มีคำเตือนใด ๆ
ดังที่คุณเห็นจากตัวอย่างนั้นช่วยให้คุณสามารถเริ่มต้นองค์ประกอบอาร์เรย์ที่เฉพาะเจาะจงได้
ที่ถูกนำมาใช้ใน C99 และก็เรียกว่าinitialiser กำหนด
โดยทั่วไปจะช่วยให้คุณกำหนดค่าเฉพาะในอาร์เรย์โดยให้ส่วนที่เหลือเป็นค่าเริ่มต้น
ในกรณีนี้ดัชนีอาร์เรย์คือรหัสสแกนแป้นพิมพ์ 0x3a
เป็นสแกนรหัสที่อยู่ในชุดที่ 1 (ดูส่วน 10.6) สำหรับCapsLock
ที่สำคัญ0x45
คือNumLock
และ 0x46 ScrollLock
คือ
ในลิงค์แรกด้านบนระบุว่า:
int a[6] = { [4] = 29, [2] = 15 };
เทียบเท่ากับ:
int a[6] = { 0, 0, 15, 0, 29, 0 };
น่าสนใจพอสมควรแม้ว่าลิงก์จะระบุว่า=
จำเป็น แต่ดูเหมือนจะไม่เป็นเช่นนั้น
เป็น (ใกล้เคียงกับ) ไวยากรณ์ของinitializers ที่กำหนดซึ่งเป็นคุณลักษณะ C99
โดยพื้นฐานแล้วจะเริ่มต้นส่วนต่างๆของอาร์เรย์เช่น;
int aa[4] = { [2] = 3, [1] = 6 };
รวมค่าที่สองของอาร์เรย์เป็น 6 และค่าที่สามถึง 3
ในกรณีของคุณอาร์เรย์ออฟเซ็ตเกิดขึ้นเป็นเลขฐานสิบหก (0x3a) ซึ่งเริ่มต้นองค์ประกอบที่ 58 ของอาร์เรย์เป็นค่าของ CAPSLOCK ซึ่งน่าจะกำหนดไว้ในโค้ดเหนือรหัสที่คุณกำลังแสดง
เวอร์ชันในโค้ดของคุณที่ไม่มี=
ดูเหมือนว่าจะเป็นส่วนขยายเฉพาะของ gcc