สำหรับคำถามหลายคำตอบของคำถามนี้คือมันขึ้นอยู่กับ แทนที่จะบอกว่าอะไรดีกว่าฉันได้ให้ตัวอย่างและเป้าหมายที่ดีกว่าอันอื่น
ตัวประมวลผลล่วงหน้าและค่าคงที่มีตำแหน่งการใช้งานที่เหมาะสม
ในกรณีของตัวประมวลผลล่วงหน้ารหัสจะถูกลบออกก่อนเวลารวบรวม ดังนั้นจึงเหมาะที่สุดสำหรับสถานการณ์ที่รหัสที่คาดว่าจะไม่ได้รับการรวบรวม สิ่งนี้สามารถส่งผลต่อโครงสร้างโมดูลการพึ่งพาและอาจอนุญาตให้เลือกเซ็กเมนต์โค้ดที่ดีที่สุดสำหรับแง่มุมประสิทธิภาพ ในกรณีต่อไปนี้จะต้องแบ่งรหัสโดยใช้ตัวประมวลผลล่วงหน้าเท่านั้น
รหัสหลายแพลตฟอร์ม:
ตัวอย่างเช่นเมื่อมีการรวบรวมรหัสภายใต้แพลตฟอร์มที่แตกต่างกันเมื่อรหัสมีการพึ่งพาหมายเลขรุ่นเฉพาะของระบบปฏิบัติการ (หรือแม้กระทั่งรุ่นคอมไพเลอร์ - แม้ว่าจะเป็นเรื่องยากมาก) ตัวอย่างเช่นเมื่อคุณกำลังจัดการกับโค้ดคู่หูขนาดใหญ่แบบเอนด์เอนด์ของลิตเติ้ลเอนเดียนพวกเขาจะต้องถูกแยกด้วยพรีโพรเซสเซอร์มากกว่าค่าคงที่ หรือถ้าคุณกำลังคอมไพล์โค้ดสำหรับ Windows รวมถึง Linux และการเรียกระบบบางอย่างจะแตกต่างกันมาก
แพทช์ทดลอง:
อีกกรณีที่สิ่งนี้ทำให้มีความชอบธรรมก็คือรหัสการทดลองบางอย่างที่มีความเสี่ยงหรือโมดูลที่สำคัญบางอย่างที่ต้องละเว้นซึ่งจะมีการเชื่อมโยงหรือประสิทธิภาพที่แตกต่างกันอย่างมีนัยสำคัญ เหตุผลหนึ่งที่ต้องการปิดใช้งานรหัสผ่านตัวประมวลผลล่วงหน้าแทนที่จะซ่อนอยู่ภายใต้if ()เป็นเพราะเราอาจไม่แน่ใจเกี่ยวกับข้อผิดพลาดของชุดการเปลี่ยนแปลงเฉพาะนี้และเรากำลังทำงานภายใต้พื้นฐานการทดลอง ถ้ามันล้มเหลวเราต้องทำอะไรอย่างอื่นนอกจากปิดการใช้งานรหัสนั้นในการผลิตกว่าเขียนใหม่ บางครั้งมันก็เหมาะที่จะใช้#if 0
เพื่อแสดงความคิดเห็นรหัสทั้งหมด
การจัดการกับการพึ่งพา:
เหตุผลอื่นที่คุณอาจต้องการสร้างตัวอย่างเช่นถ้าคุณไม่ต้องการสนับสนุนภาพ JPEG คุณสามารถกำจัดการคอมไพล์โมดูล / สตับนั้นและในที่สุดไลบรารีจะไม่เชื่อมโยง (แบบคงที่หรือแบบไดนามิก) ไปที่ โมดูล. บางครั้งแพคเกจรัน./configure
เพื่อระบุความพร้อมใช้งานของการพึ่งพาดังกล่าวและหากไม่มีไลบรารี (หรือผู้ใช้ไม่ต้องการเปิดใช้งาน) ฟังก์ชันดังกล่าวจะถูกปิดใช้งานโดยอัตโนมัติโดยไม่ต้องเชื่อมโยงกับไลบรารีนั้น ที่นี่จะเป็นประโยชน์เสมอหากมีการสร้างคำสั่งเหล่านี้โดยอัตโนมัติ
อนุญาตให้ใช้สิทธิ์:
หนึ่งที่น่าสนใจมากของตัวอย่างของ preprocessor สั่งมีffmpeg มีตัวแปลงสัญญาณซึ่งอาจละเมิดสิทธิบัตรโดยการใช้งาน หากคุณดาวน์โหลดซอร์สและคอมไพล์เพื่อติดตั้งระบบจะถามคุณว่าคุณต้องการหรือไม่เก็บสิ่งนั้นไว้ การซ่อนรหัสไว้ภายใต้เงื่อนไขบางประการหากเงื่อนไขยังคงสามารถนำคุณเข้าสู่ศาล!
คัดลอกโค้ดวาง:
Aka แมโคร นี่ไม่ใช่คำแนะนำในการใช้งานมาโครมากเกินไป - แค่มาโครนั้นมีวิธีที่มีประสิทธิภาพมากกว่าในการใช้งานการเทียบสำเนาที่ผ่านมา แต่ใช้ด้วยความระมัดระวัง และใช้มันหากคุณรู้ว่าคุณกำลังทำอะไรอยู่ แน่นอนว่าคงไม่สามารถทำได้ แต่สามารถใช้inline
ฟังก์ชั่นได้เช่นกันหากทำได้ง่าย
ดังนั้นคุณจะใช้ค่าคงที่เมื่อใด
เกือบทุกที่อื่น
การไหลของรหัส Neater:
โดยทั่วไปเมื่อคุณใช้ค่าคงที่มันแทบจะแยกไม่ออกจากตัวแปรปกติและด้วยเหตุนี้จึงเป็นรหัสที่อ่านได้ดีกว่า หากคุณเขียนรูทีนที่มี 75 บรรทัด - มี 3 หรือ 4 บรรทัดหลังจากทุก 10 บรรทัดที่มี #ifdef จะไม่สามารถอ่านได้มาก อาจได้รับค่าคงที่หลักภายใต้ #ifdef และใช้ในการไหลตามธรรมชาติทุกที่
รหัสเยื้องดี: ทุก preprocessor สั่งไม่เคยทำงานได้ดีกับรหัสมิฉะนั้นเยื้องกัน แม้ว่าคอมไพเลอร์ของคุณอนุญาตการเยื้องของ #def ตัวประมวลผลล่วงหน้า Pre-ANSI C ไม่อนุญาตให้มีช่องว่างระหว่างจุดเริ่มต้นของบรรทัดและอักขระ "#"; "#" นำหน้าจะต้องอยู่ในคอลัมน์แรกเสมอ
การกำหนดค่า:
อีกเหตุผลหนึ่งที่ว่าทำไมค่าคงที่ / หรือตัวแปรมีเหตุผลก็คือพวกเขาสามารถวิวัฒนาการได้อย่างง่ายดายจากการเชื่อมโยงกับ globals หรือในอนาคตสามารถขยายได้จากไฟล์การกำหนดค่า
สิ่งหนึ่งที่ล่าสุด:
ไม่เคยใช้ preprocessor สั่ง#ifdef
การข้ามขอบเขตหรือ#endif
{ ... }
คือจุดเริ่มต้นของ#ifdef
หรือวางของด้านข้างแตกต่างกันของ#endif
{ ... }
มันแย่มาก อาจสร้างความสับสนและอาจเป็นอันตรายได้ในบางครั้ง
แน่นอนว่านี่ไม่ใช่รายการที่ละเอียดถี่ถ้วน แต่แสดงให้คุณเห็นถึงความแตกต่างอย่างสิ้นเชิงซึ่งเป็นวิธีที่ใช้งานได้ง่ายกว่า มันไม่ได้เกี่ยวกับสิ่งที่ดีกว่ามันอยู่เสมอมากกว่าที่จะเป็นธรรมชาติมากกว่าที่จะใช้ในบริบทที่กำหนด