ฟังก์ชั่นมาโคร vs. คงที่ในส่วนหัว


9

สำหรับงานด่วนจำนวนมากที่สามารถใช้ฟังก์ชั่นf(x,y)ได้ใน C ธรรมดาจะใช้มาโคร ฉันต้องการถามเฉพาะเกี่ยวกับกรณีเหล่านี้ซึ่งสามารถแก้ไขได้โดยการเรียกใช้ฟังก์ชัน (เช่นมาโครที่ใช้สำหรับฟังก์ชั่นอินไลน์ไม่ใช่สำหรับการขยายโค้ดของรหัสที่กำหนดเอง)

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

มีบางกรณีที่นี่ไม่ใช่ความคิดที่ดีหรือไม่?

อีกครั้ง: ไม่ถามเกี่ยวกับมาโครการผลิตรหัสด้วย ## โครงสร้างที่เหมือนกันซึ่งไม่สามารถแสดงเป็นฟังก์ชันได้เลย


4
ผมคิดว่าคำถามของคุณอาจจะได้รับการตอบรับที่นี่stackoverflow.com/questions/9104568/macro-vs-function-in-cและนี่stackoverflow.com/questions/1358232/why-use-macros-in-c
มารุ

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

2
จริง ๆ แล้วฉันสงสัยว่าสิ่งเหล่านี้ส่วนใหญ่เป็นเหตุผลทางประวัติศาสตร์ เมื่อไม่นานมานี้คอมไพเลอร์ C ไม่ได้ทำหน้าที่อินไลน์เลย ดังนั้นผู้คนจึงใช้มาโครในสิ่งที่พวกเขาต้องการ รหัส C มักจะอายุยืนผิดปกติ
Jan Hudec

@ratchetfreak: C ไม่มีinlineนี่ไม่เกี่ยวกับ C ++
wirrbel

2
@wirrbel แน่นอนว่ามีinlineใน C อย่างน้อยก็ตั้งแต่ C99 สำหรับภาพรวมอย่างรวดเร็วดูวิกิพีเดียในการทำงานแบบอินไลน์
amon

คำตอบ:


6

มาโครที่แก้ไขได้ด้วยการเรียกใช้ฟังก์ชันมีข้อผิดพลาดมากมาย:

  • ++iพวกเขามีความยากที่จะเขียนเพราะคุณอาจจะมีการจัดการอย่างถูกต้องเช่นการขัดแย้ง
  • มันยากที่จะทำการดีบักด้วย visual debugger เนื่องจากคุณไม่สามารถผ่านแมโครหรือใส่จุดพักได้
  • มันยากที่จะจัดการอย่างถูกต้องเมื่อวิเคราะห์การพึ่งพาการรวบรวม

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

โดยทั่วไปฟังก์ชั่น C จะไม่ถูกแทรกเนื่องจากมันอาจถูกลิงค์ไปจากไฟล์ C อื่น ๆ

ไม่มีเหตุผลว่าทำไมคอมไพเลอร์จะไม่สามารถให้ฟังก์ชั่นสองเวอร์ชันได้, called ed ดั้งเดิมและinlined one คุณควรดูเอกสารประกอบของคอมไพเลอร์ที่คุณกำหนดเป้าหมาย นอกจากนี้คุณอาจต้องการดูแอสเซมบลีที่สร้างขึ้น: แม้ว่าคุณจะไม่ทราบแอสเซมบลีคุณสามารถเรียนรู้ที่จะบอกได้อย่างรวดเร็วว่าบางฟังก์ชั่นอินไลน์หรือไม่ (เริ่มจากตัวอย่างทารกเพื่อเรียนรู้สิ่งนี้อย่างรวดเร็ว)

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