เหตุใดจึงส่งค่าพารามิเตอร์ของฟังก์ชันที่ไม่ได้ใช้ให้เป็นโมฆะ


98

ในโครงการ C บางโครงการฉันเห็นรหัสนี้:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

การร่ายทั้งสองเป็นโมฆะมีจุดประสงค์ใดหรือไม่?


ปิดการลงคะแนนเนื่องจากคำตอบที่ถูกต้อง (การยับยั้งคำเตือนของคอมไพเลอร์เกี่ยวกับพารามิเตอร์ที่ไม่ได้ใช้) อยู่ในคำถามที่เชื่อมโยงของ Charles
TED

@ โคดี้เกรย์ - มันถูกปิดด้วยเหตุผลนั้น อย่างไรก็ตามในความเป็นจริงแล้วมันไม่ได้เป็นคำถามซ้ำซ้อน 689677 กำลังพูดถึงการส่งกลับการหล่อเป็นโมฆะไม่ใช่พารามิเตอร์
TED

19
อันที่จริงทั้งสองรายการที่ซ้ำกันไม่สามารถใช้ได้กับคำถามนี้ หนึ่งคือ C ++ อีกอันเกี่ยวกับค่าส่งคืน เหล่านี้เป็นสิ่งที่ไม่เหมือนกัน มีพารามิเตอร์ C ซ้ำกันหรือไม่
Matt Joiner

2
นี่เป็นคำถามที่แตกต่างจากที่แนะนำให้ทำซ้ำ ฉันเห็นได้ว่าทำไมถึงทำผิดพลาด เปิดใหม่ (ชัด ๆ )
Tim Post

4
หมายเหตุ: โปรดอย่าปิดสิ่งนี้เนื่องจากคำถาม C ++ ซ้ำกันเนื่องจาก C ++ ใช้(void)เพื่อเอฟเฟกต์ที่แตกต่างกันบ้าง คำถามนี้เกี่ยวกับ C
Antti Haapala

คำตอบ:


89

มีไว้เพื่อหลีกเลี่ยงคำเตือนจากคอมไพลเลอร์เนื่องจากไม่ได้ใช้พารามิเตอร์บางตัว


3
วิธีใดที่ดีที่สุดในการระงับคำเตือน: stackoverflow.com/questions/3417837/…
Ciro Santilli 郝海东冠状病六四事件法轮功

@Benoit หล่อเป็นโมฆะทำอะไรได้จริง? เป็นฟังก์ชันเดียวที่จะแสดงให้คอมไพเลอร์เห็นว่าคุณจงใจละเว้นบางสิ่งบางอย่างหรือไม่ (โมฆะ) ทำอะไรบางอย่างจริง ๆ และเมื่อคอมไพเลอร์เห็นมันก็จะนับว่าได้ทำบางอย่างกับตัวแปรแล้วจึงไม่ออกคำเตือนหรือไม่?
Tan Wang

2
@TanWang ฟังก์ชั่นเดียวคือแสดงคอมไพเลอร์ว่าคุณจงใจละเว้นบางสิ่ง มันจะไม่ทำอะไรเลยในรันไทม์
zwol

14

สาเหตุของการมีพารามิเตอร์ที่ไม่ได้ใช้ในต้นแบบมักเป็นเพราะฟังก์ชันจำเป็นต้องสอดคล้องกับ API ภายนอกบางอย่าง - บางทีอาจเป็นฟังก์ชันไลบรารีหรือตัวชี้ไปยังฟังก์ชันนั้นจะถูกส่งไปยังฟังก์ชันอื่นที่คาดว่าจะมีการเรียกใช้แบบนี้ อย่างไรก็ตามไม่ใช่ว่าอาร์กิวเมนต์ทั้งหมดที่ใช้โดยรูปแบบการเรียกนั้นจำเป็นจริงๆในฟังก์ชันเอง

เหตุผลในการกล่าวถึงชื่อพารามิเตอร์ในเนื้อหาคือการหลีกเลี่ยงคำเตือนเช่น

unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

คำเตือนนี้สามารถระงับได้โดยใช้พารามิเตอร์จริงในเนื้อหาของฟังก์ชัน ตัวอย่างเช่นหากคุณมีคำสั่งต่อไปนี้:

ud;

ขณะนี้คำเตือนนี้ถูกระงับ อย่างไรก็ตามตอนนี้ GCC จะออกคำเตือนอีกครั้ง :

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

คำเตือนนี้บอกว่าคำสั่งud;ในขณะที่เป็น C ที่ถูกต้องทางวากยสัมพันธ์ไม่ส่งผลกระทบใด ๆ เลยและอาจเป็นข้อผิดพลาดซึ่งไม่ต่างจากคำสั่ง

abort;

ซึ่งอาจจะเขียนabort();แทนเพื่อทำอะไรบางอย่าง

และนั่นคือสิ่งที่(void)นักแสดงเข้ามา - มันจะบอกคอมไพเลอร์อย่างชัดเจนและชัดเจนว่าคำสั่งนั้นควรจะไม่มีผลอย่างแน่นอน

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