สิ่งที่ลงทะเบียน const char * const * ชื่อ; ค่าเฉลี่ยและเหตุใดตัวแปรนี้จึงอยู่นอกฟังก์ชัน [ซ้ำ]
void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();
}
ฉันไม่เข้าใจว่าทำไมตัวแปร register ไม่อยู่ในวงเล็บปีกกาและนี่คืออะไร (โมฆะ) หน้า fprintf? ลงทะเบียน const char * const * cpp ด้วยฉันไม่เคยเห็นอะไรแบบนี้มาก่อน
คำตอบ
register
คำหลักเป็นคำใบ้ที่จะคอมไพเลอร์ที่คุณต้องการค่าที่จะเก็บไว้ในการลงทะเบียนเฉพาะบนหน่วยประมวลผล สิ่งนี้สามารถเร่งความเร็วในการอ่านและเขียน อย่างไรก็ตามด้วยคอมไพเลอร์ที่ทันสมัยการเพิ่มประสิทธิภาพประเภทนี้ไม่เพียง แต่ไม่จำเป็น แต่มักจะต่อต้าน
เหตุผลที่อยู่ระหว่างการประกาศฟังก์ชันและบล็อกคือใน c เก่า (ก่อน C90) คุณจะไม่ประกาศประเภทพารามิเตอร์ถัดจากพารามิเตอร์ แต่อยู่ระหว่างการประกาศฟังก์ชันและบล็อก
ตัวอย่างเช่น:
int main(argc, argv)
char ** argv;
{
...
}
สังเกตว่าฉันไม่ได้ทำอะไรเลยargc
เพราะถ้าคุณไม่ได้กำหนดประเภทไว้อย่างชัดเจนมันจะมีค่าเริ่มต้นเป็น int
คุณจะเห็นสิ่งนี้บ่อยกว่าที่คุณคิด ฉันพบกลุ่มนี้เมื่อฉันทำงานกับ FFMPEG
สิ่งที่ส่ง (เป็นโมฆะ) จะป้องกันคำเตือน / ข้อผิดพลาดเกี่ยวกับพารามิเตอร์ที่ไม่ได้ใช้ ฉันพบปัญหานี้เมื่อทำงานกับ PortAudio ด้วยฟังก์ชันการโทรกลับระดับต่ำ
เหตุผลที่คุณ "ไม่เคยเห็นมาก่อน" เป็นเพราะสิ่งนี้ใช้ไวยากรณ์ของK&R C เวอร์ชันดั้งเดิมในอดีต นั่นต้องเป็นรหัส C ของจริงที่คุณกำลังดูอยู่ ฉันเพิ่งมองขึ้นไปและ ANSI C (C90) ออกมาในปี 1990 ดังนั้นรหัสนี้ต้องมีอายุอย่างน้อย 30 ปีหรือมากกว่านั้น
ฉันคิดว่านี่เป็นสิ่งที่ต้องรู้หากจำเป็นต้องจัดการกับรหัส C ในอดีต แต่อย่างอื่นคุณก็สามารถลืมได้
การ(void)
ร่ายหมายถึงสิ่งเดียวกับที่หมายถึงวันนี้