ในการตอบคำถามของคุณให้คิดถึงว่ามาโครใดที่ใช้งานเป็นส่วนใหญ่ (คำเตือน: โค้ดที่คอมไพล์ด้วยสมอง)
- มาโครใช้เพื่อกำหนดค่าคงที่เชิงสัญลักษณ์
#define X 100
สิ่งนี้สามารถถูกแทนที่ด้วย: const int X = 100;
- มาโครใช้เพื่อกำหนดฟังก์ชั่นประเภทผู้ไม่เชื่อเรื่องพระเจ้าแบบอินไลน์
#define max(X,Y) (X>Y?X:Y)
ในภาษาใด ๆ ที่รองรับการโอเวอร์โหลดของฟังก์ชั่นสิ่งนี้สามารถเลียนแบบได้ในลักษณะที่ปลอดภัยกว่าโดยการใช้ฟังก์ชั่นโอเวอร์โหลดในประเภทที่ถูกต้องหรือในภาษาที่รองรับ Generics โดยฟังก์ชั่นทั่วไป มาโครจะพยายามเปรียบเทียบสิ่งต่าง ๆอย่างมีความสุขรวมถึงพอยน์เตอร์หรือสตริงซึ่งอาจรวบรวมได้ แต่แทบจะไม่ใช่สิ่งที่คุณต้องการ ในทางกลับกันถ้าคุณทำมาโครเซฟประเภทพวกเขาจะไม่ได้รับประโยชน์หรือความสะดวกสบายในการทำงานที่มากเกินไป
- มาโครใช้เพื่อระบุทางลัดไปยังองค์ประกอบที่ใช้บ่อย
#define p printf
สิ่งนี้ถูกแทนที่อย่างง่ายดายด้วยฟังก์ชั่นp()
ที่ทำสิ่งเดียวกัน นี่ค่อนข้างเกี่ยวข้องกับ C (ต้องการให้คุณใช้va_arg()
ตระกูลของฟังก์ชัน) แต่ในภาษาอื่น ๆ อีกมากมายที่รองรับจำนวนตัวแปรของฟังก์ชันอาร์กิวเมนต์มันง่ายกว่ามาก
การสนับสนุนคุณสมบัติเหล่านี้ในภาษามากกว่าภาษาแมโครพิเศษนั้นง่ายกว่ามีข้อผิดพลาดน้อยกว่าและสับสนน้อยกว่ากับผู้อื่นที่อ่านโค้ด ที่จริงแล้วฉันไม่สามารถนึกถึงกรณีใช้งานครั้งเดียวสำหรับมาโครที่ไม่สามารถทำซ้ำได้อย่างง่ายดายในอีกทางหนึ่ง เพียงสถานที่ที่แมโครมีประโยชน์อย่างแท้จริงคือเมื่อพวกเขาจะเชื่อมโยงกับโครงสร้างรวบรวมเงื่อนไขเช่น#if
( ฯลฯ )
ในจุดนั้นฉันจะไม่โต้เถียงกับคุณเพราะฉันเชื่อว่าการแก้ปัญหาที่ไม่ใช่พรีโปรเซสเซอร์ในการรวบรวมเงื่อนไขในภาษายอดนิยมนั้นยุ่งยากมาก (เช่นการฉีด bytecode ใน Java) แต่ภาษาอย่าง D ได้มาพร้อมกับโซลูชันที่ไม่ต้องการตัวประมวลผลล่วงหน้าและไม่ยุ่งยากกว่าการใช้เงื่อนไขตัวประมวลผลล่วงหน้าในขณะที่มีข้อผิดพลาดน้อยกว่ามาก