สิ่งที่ลงทะเบียน const char * const * ชื่อ; ค่าเฉลี่ยและเหตุใดตัวแปรนี้จึงอยู่นอกฟังก์ชัน [ซ้ำ]

Jan 01 2021
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 ด้วยฉันไม่เคยเห็นอะไรแบบนี้มาก่อน

คำตอบ

6 JacobBlomquist Jan 01 2021 at 04:52

registerคำหลักเป็นคำใบ้ที่จะคอมไพเลอร์ที่คุณต้องการค่าที่จะเก็บไว้ในการลงทะเบียนเฉพาะบนหน่วยประมวลผล สิ่งนี้สามารถเร่งความเร็วในการอ่านและเขียน อย่างไรก็ตามด้วยคอมไพเลอร์ที่ทันสมัยการเพิ่มประสิทธิภาพประเภทนี้ไม่เพียง แต่ไม่จำเป็น แต่มักจะต่อต้าน

เหตุผลที่อยู่ระหว่างการประกาศฟังก์ชันและบล็อกคือใน c เก่า (ก่อน C90) คุณจะไม่ประกาศประเภทพารามิเตอร์ถัดจากพารามิเตอร์ แต่อยู่ระหว่างการประกาศฟังก์ชันและบล็อก

ตัวอย่างเช่น:

int main(argc, argv)
char ** argv;
{
 ...
}

สังเกตว่าฉันไม่ได้ทำอะไรเลยargcเพราะถ้าคุณไม่ได้กำหนดประเภทไว้อย่างชัดเจนมันจะมีค่าเริ่มต้นเป็น int

คุณจะเห็นสิ่งนี้บ่อยกว่าที่คุณคิด ฉันพบกลุ่มนี้เมื่อฉันทำงานกับ FFMPEG

สิ่งที่ส่ง (เป็นโมฆะ) จะป้องกันคำเตือน / ข้อผิดพลาดเกี่ยวกับพารามิเตอร์ที่ไม่ได้ใช้ ฉันพบปัญหานี้เมื่อทำงานกับ PortAudio ด้วยฟังก์ชันการโทรกลับระดับต่ำ

13 SamVarshavchik Jan 01 2021 at 04:26

เหตุผลที่คุณ "ไม่เคยเห็นมาก่อน" เป็นเพราะสิ่งนี้ใช้ไวยากรณ์ของK&R C เวอร์ชันดั้งเดิมในอดีต นั่นต้องเป็นรหัส C ของจริงที่คุณกำลังดูอยู่ ฉันเพิ่งมองขึ้นไปและ ANSI C (C90) ออกมาในปี 1990 ดังนั้นรหัสนี้ต้องมีอายุอย่างน้อย 30 ปีหรือมากกว่านั้น

ฉันคิดว่านี่เป็นสิ่งที่ต้องรู้หากจำเป็นต้องจัดการกับรหัส C ในอดีต แต่อย่างอื่นคุณก็สามารถลืมได้

การ(void)ร่ายหมายถึงสิ่งเดียวกับที่หมายถึงวันนี้