ในส่วนนี้ เราจะมาดูกันว่าอะไรคือความแตกต่างระหว่างมาโครและฟังก์ชันใน 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.
ดังนั้นจึงไม่แนะนำให้ใช้มาโครสำหรับปัญหาต่อไปนี้ −
-
ไม่มีการตรวจสอบประเภท
-
ค่าเริ่มต้นในการดีบัก เนื่องจากทำให้เกิดการแทนที่อย่างง่าย
-
มาโครไม่มีเนมสเปซ ดังนั้นหากมีการกำหนดมาโครในส่วนใดส่วนหนึ่งก็สามารถใช้ในอีกส่วนหนึ่งได้
-
มาโครจะเพิ่มความยาวของโค้ดเมื่อมีการเพิ่มก่อนโค้ดขณะประมวลผลล่วงหน้า
-
มาโครไม่ตรวจสอบข้อผิดพลาดของเวลาในการคอมไพล์