Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

มาโครกับฟังก์ชันในC


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

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

ตัวอย่าง

#include <stdio.h>
#define SQUARE(x) x * x
int sqr(int x) {
   return x*x;
}
main() {
   printf("Use of sqr(). The value of sqr(3+2): %d\n", sqr(3+2));
   printf("Use of SQUARE(). The value of SQUARE(3+2): %d", SQUARE(3+2));
}

ผลลัพธ์

Use of sqr(). The value of sqr(3+2): 25
Use of SQUARE(). The value of SQUARE(3+2): 11

ฟังก์ชันและมาโครเราต้องการทั้งสองอย่างจะทำงานเหมือนกัน แต่ที่นี่ เราจะเห็นว่าผลลัพธ์ไม่เหมือนกัน สาเหตุหลักคือเมื่อเราส่งผ่าน 3 + 2 เป็นอาร์กิวเมนต์ของฟังก์ชัน มันจะแปลงเป็น 5 แล้วคำนวณ 5 * 5 =25 สำหรับมาโคร จะทำ 3 + 2 * 3 + 2 =3 + 6 + 2 =11.

ดังนั้นจึงไม่แนะนำให้ใช้มาโครสำหรับปัญหาต่อไปนี้ −

  • ไม่มีการตรวจสอบประเภท

  • ค่าเริ่มต้นในการดีบัก เนื่องจากทำให้เกิดการแทนที่อย่างง่าย

  • มาโครไม่มีเนมสเปซ ดังนั้นหากมีการกำหนดมาโครในส่วนใดส่วนหนึ่งก็สามารถใช้ในอีกส่วนหนึ่งได้

  • มาโครจะเพิ่มความยาวของโค้ดเมื่อมีการเพิ่มก่อนโค้ดขณะประมวลผลล่วงหน้า

  • มาโครไม่ตรวจสอบข้อผิดพลาดของเวลาในการคอมไพล์