[N … M] หมายถึงอะไรใน C aggregate initializers?


101

จากsys.cบรรทัด 123:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tableเป็นตัวชี้ทั่วไปไปยังอาร์เรย์ฉันเห็นว่า อย่างไรก็ตามสัญกรณ์คืออะไร:

[0 ... __NR_syscalls-1]

คืออะไร...?


แก้ไข:
ผมได้เรียนรู้เคล็ดลับ C อีกที่นี่: #include <asm/unistd.h>จะได้รับการประมวลผลล่วงหน้า[0 ... _NR_syscalls-1]และแทนที่ด้วยเนื้อหาและมอบหมายให้


2
ไม่ใช่ไม่ใช่ตัวชี้ไปยังอาร์เรย์ แต่เป็นอาร์เรย์ของพอยน์เตอร์ จะมีการประกาศตัวชี้ไปยังอาร์เรย์void (*sys_call_table)[__NR_syscalls]
Patrick Schlüter

@tristopia คุณพูดถูก สิ่งที่ฉันหมายถึงคือตัวชี้ไปที่อาร์เรย์คล้ายกับchar *argv[]. แก้ไขแล้ว.
Amumu

คำตอบ:


90

มันเป็นการเริ่มต้นใช้Initializers ที่กำหนด

การเริ่มต้นตามช่วงคือส่วนขยาย gnu gcc

[first ... last] = valueในการเริ่มต้นช่วงขององค์ประกอบกับค่าเดียวกันเขียน นี่คือส่วนขยาย GNU ตัวอย่างเช่น,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

ไม่สามารถพกพาได้ รวบรวมด้วย-pedanticบอกเลย.

ที่นี่ทำงานอย่างไร?
ตัวประมวลผลก่อนแทนที่#include <asm/unistd.h>ด้วยเนื้อหาจริง ( กำหนดค่าคงที่และประเภทสัญลักษณ์เบ็ดเตล็ดและประกาศฟังก์ชันเบ็ดเตล็ด ) ในโครงสร้างตามช่วงซึ่งจะใช้เพิ่มเติมสำหรับการเริ่มต้นอาร์เรย์ของพอยน์เตอร์


ดูเหมือนว่าจะไม่สามารถพกพาได้ คือ?
Ivaylo Strandjev

5
@Mehrdad microsoft c compiler เป็นไปตามมาตรฐาน c99 หรือไม่ ฉันพักที่นี่ ... c99
Aftnix

3
@ Mehrdad: อันที่จริงเฉพาะโครงสร้างตามช่วงของ Designated Initializers เท่านั้นที่เป็นส่วนขยาย gcc ตัวเริ่มต้นที่กำหนดเองได้รับอนุญาตตามมาตรฐาน C
Alok Save

2
@ Mehrdad: ขออภัยฉันไม่ต้องการเป็นส่วนหนึ่งของเหยื่อเปลวไฟใด ๆ ความตั้งใจของฉันเพียงเพื่อชี้แจงรายละเอียดที่ลึกซึ้งซึ่งฉันคิดว่าคุณเข้าใจผิด
Alok Save

2
@ Mehrdad: เพื่อความชัดเจนช่วงสร้างแบบพกพาเฉพาะกับ gcc (และคอมไพเลอร์ที่ใช้ส่วนขยาย) และตัวเริ่มต้นที่กำหนดโดยทั่วไปนั้นพกพาได้เฉพาะกับคอมไพเลอร์ที่รองรับ C99 (หรืออย่างน้อยก็เป็นคุณสมบัติเฉพาะนั้น)
Keith Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.