ลองศึกษาความแตกต่างระหว่างอินไลน์และมาโครด้วยความช่วยเหลือของกราฟเปรียบเทียบ
แผนภูมิเปรียบเทียบ
พื้นฐานสำหรับการเปรียบเทียบ | inline | มาโคร |
---|---|---|
ขั้นพื้นฐาน | ฟังก์ชันอินไลน์ถูกวิเคราะห์คำโดยคอมไพเลอร์ | แมโครถูกขยายโดยตัวประมวลผลล่วงหน้า |
วากยสัมพันธ์ | อินไลน์ return_type funct_name (พารามิเตอร์) {. . . } | #define macro_name char_sequence |
คำหลักที่ใช้ | แบบอินไลน์ | #กำหนด |
ที่กำหนดไว้ | สามารถกำหนดภายในหรือภายนอกชั้นเรียน | มันถูกกำหนดไว้เสมอเมื่อเริ่มต้นโปรแกรม |
การประเมินผล | มันประเมินข้อโต้แย้งเพียงครั้งเดียว | มันประเมินข้อโต้แย้งทุกครั้งที่มีการใช้ในรหัส |
การขยายตัว | คอมไพเลอร์อาจไม่อินไลน์และขยายฟังก์ชั่นทั้งหมด | แมโครจะถูกขยายเสมอ |
การทำงานอัตโนมัติ | ฟังก์ชั่นสั้น ๆ ที่กำหนดไว้ในชั้นเรียนจะทำโดยอัตโนมัติในฟังก์ชั่นแบบอินไลน์ | ควรกำหนดมาโครเป็นพิเศษ |
การเข้าถึง | ฟังก์ชั่นสมาชิกแบบอินไลน์สามารถเข้าถึงข้อมูลสมาชิกของชั้นเรียน | แมโครไม่สามารถเป็นสมาชิกของคลาสและไม่สามารถเข้าถึงข้อมูลสมาชิกของคลาสได้ |
การสิ้นสุด | นิยามของฟังก์ชั่นอินไลน์สิ้นสุดลงด้วยวงเล็บปีกกาที่ท้ายฟังก์ชั่นอินไลน์ | นิยามของแมโครยุติด้วยบรรทัดใหม่ |
แก้จุดบกพร่อง | การดีบักเป็นเรื่องง่ายสำหรับฟังก์ชั่นอินไลน์เนื่องจากการตรวจสอบข้อผิดพลาดเสร็จสิ้นในระหว่างการคอมไพล์ | การดีบักกลายเป็นเรื่องยากสำหรับแมโครเนื่องจากการตรวจสอบข้อผิดพลาดจะไม่เกิดขึ้นระหว่างการรวบรวม |
ผูกพัน | ฟังก์ชั่นอินไลน์ผูกคำสั่งทั้งหมดในร่างกายของฟังก์ชั่นได้เป็นอย่างดีเช่นเดียวกับร่างกายของฟังก์ชั่นเริ่มต้นและสิ้นสุดด้วยวงเล็บปีกกา | แมโครประสบปัญหาการเชื่อมโยงหากมีคำสั่งมากกว่าหนึ่งคำสั่งเนื่องจากไม่มีสัญลักษณ์การเลิกจ้าง |
คำจำกัดความของ Inline
ฟังก์ชั่นแบบอินไลน์ดูเหมือนว่าฟังก์ชั่นปกติ แต่นำหน้าด้วยคำหลัก " inline " ฟังก์ชั่นแบบอินไลน์คือฟังก์ชั่นความยาวสั้นซึ่งจะขยายที่จุดของการร้องขอแทนที่จะถูกเรียก มาทำความเข้าใจฟังก์ชั่นอินไลน์ด้วยตัวอย่าง
# รวมถึงการใช้เนมสเปซ std; ตัวอย่างคลาส {int a, b; สาธารณะ: อินไลน์โมฆะเริ่มต้น (int x, int y) {a = x; b = y} การแสดงผลเป็นโมฆะ () {ศาล << a << "" <ในโปรแกรมข้างต้นฉันประกาศและกำหนดฟังก์ชั่นการเริ่มต้น () เป็นฟังก์ชั่นแบบอินไลน์ในระดับ“ ตัวอย่าง” รหัสของการเริ่มต้น () ฟังก์ชั่นจะขยายที่มันถูกเรียกโดยวัตถุของคลาส "ตัวอย่าง" ฟังก์ชั่นการแสดงผล () ที่กำหนดไว้ในตัวอย่างชั้นไม่ได้ประกาศแบบอินไลน์ แต่มันอาจจะพิจารณาแบบอินไลน์โดยคอมไพเลอร์ ใน C ++ ฟังก์ชั่นที่กำหนดไว้ในชั้นเรียนจะถูกสร้างขึ้นโดยอัตโนมัติโดยคอมไพเลอร์พิจารณาความยาวของฟังก์ชั่น
- ฟังก์ชั่นแบบอินไลน์ช่วยลดค่าใช้จ่ายของการเรียกใช้ฟังก์ชันและส่งคืนซึ่งจะช่วยลดเวลาในการดำเนินการของโปรแกรม นอกจากนี้ยังมีการส่งข้อโต้แย้งไปยังสแต็กและการลงทะเบียนจะถูกบันทึกไว้เมื่อมีการเรียกใช้ฟังก์ชันและรีเซ็ตเมื่อฟังก์ชันส่งคืนซึ่งใช้เวลาจึงหลีกเลี่ยงการทำงานแบบอินไลน์เนื่องจากไม่จำเป็นต้องสร้างตัวแปรท้องถิ่นและพารามิเตอร์ทางการในแต่ละครั้ง .
- ฟังก์ชั่นแบบอินไลน์สามารถเป็นสมาชิกของชั้นเรียนและยังสามารถเข้าถึงข้อมูลสมาชิกของชั้นเรียน
- ฟังก์ชั่นแบบอินไลน์ช่วยลดเวลาในการดำเนินการของโปรแกรม แต่บางครั้งหากความยาวของฟังก์ชั่นแบบอินไลน์มากกว่านั้นขนาดของโปรแกรมก็จะเพิ่มขึ้นเนื่องจากรหัสที่ซ้ำกัน ดังนั้นจึงเป็นวิธีปฏิบัติที่ดีในการทำหน้าที่เล็กมาก ๆ
- ข้อโต้แย้งของฟังก์ชั่นแบบอินไลน์ถูกประเมินเพียงครั้งเดียว
นิยามของมาโคร
มาโครคือ“ คำสั่งตัวประมวลผลล่วงหน้า” ก่อนการรวบรวมโปรแกรมจะถูกตรวจสอบโดยตัวประมวลผลล่วงหน้าและเมื่อใดก็ตามที่พบแมโครในโปรแกรมมันจะแทนที่แมโครนั้นด้วยคำจำกัดความ ดังนั้นมาโครถือว่าเป็น "การแทนที่ข้อความ" ให้เราศึกษามาโครพร้อมกับตัวอย่าง
#include #define GREATER (a, b) ((a <b)? b: a) int main (void) {cout << "มากกว่า 10 และ 20 คือ" << GREATER ("20", "10") << "\ n"; กลับ 0 }
ในโค้ดด้านบนฉันประกาศฟังก์ชันแมโคร GREATER () ซึ่งเปรียบเทียบและค้นหาจำนวนพารามิเตอร์ทั้งสองที่มากขึ้น คุณสามารถสังเกตเห็นว่าไม่มีเครื่องหมายอัฒภาคเพื่อยกเลิกแมโครเนื่องจากแมโครจะถูกยกเลิกโดยบรรทัดใหม่เท่านั้น เนื่องจากแมโครเป็นเพียงการแทนที่ข้อความจึงจะขยายรหัสของแมโครที่ถูกเรียกใช้
- แมโครถูกกำหนดไว้ในตัวพิมพ์ใหญ่เสมอเพื่อให้ง่ายสำหรับโปรแกรมเมอร์ในการระบุมาโครทั้งหมดในโปรแกรมขณะที่อ่าน
- แมโครไม่สามารถเป็นฟังก์ชันสมาชิกของคลาสได้และไม่สามารถเข้าถึงข้อมูลสมาชิกของคลาสใด ๆ ได้
- ฟังก์ชั่นมาโครประเมินค่าอาร์กิวเมนต์แต่ละครั้งที่ปรากฏในการกำหนดซึ่งส่งผลให้เกิดผลลัพธ์ที่ไม่คาดคิด
- มาโครต้องมีขนาดเล็กลงเนื่องจากมาโครที่มีขนาดใหญ่กว่านั้นจะเพิ่มขนาดรหัสโดยไม่จำเป็น
ความแตกต่างที่สำคัญระหว่าง Inline และ Macro
- ความแตกต่างพื้นฐานระหว่างอินไลน์และแมโครคือฟังก์ชั่นอินไลน์ถูกแยกวิเคราะห์โดยคอมไพเลอร์ในขณะที่มาโครในโปรแกรมจะถูกขยายโดยตัวประมวลผลล่วงหน้า
- คำหลักที่ใช้ในการกำหนดฟังก์ชั่นแบบอินไลน์คือ“ inline ” ในขณะที่คำหลักที่ใช้ในการกำหนดแมโครคือ“ #define ”
- เมื่อฟังก์ชั่นแบบอินไลน์เป็น decalre ภายในชั้นเรียนมันสามารถกำหนดได้ทั้งในชั้นเรียนหรือนอกชั้นเรียน ในทางกลับกันแมโครจะถูกกำหนดเสมอเมื่อเริ่มต้นโปรแกรม
- อาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันแบบอินไลน์จะถูกประเมินค่าเพียงครั้งเดียวในขณะที่รวบรวมในขณะที่อาร์กิวเมนต์แมโครจะถูกประเมินค่าทุกครั้งที่มีการใช้แมโครในโค้ด
- คอมไพเลอร์อาจไม่อินไลน์และขยายฟังก์ชั่นทั้งหมดที่กำหนดไว้ภายในชั้นเรียน ในทางกลับกันแมโครจะถูกขยายเสมอ
- ฟังก์ชั่นสั้น ๆ ที่กำหนดไว้ในชั้นเรียนที่ไม่มีคำหลักแบบอินไลน์จะทำฟังก์ชั่นแบบอินไลน์โดยอัตโนมัติ ในทางกลับกันควรกำหนดมาโครโดยเฉพาะ
- ฟังก์ชันที่เป็นแบบอินไลน์สามารถเข้าถึงสมาชิกของคลาสได้ในขณะที่แมโครไม่สามารถเข้าถึงสมาชิกของคลาสได้
- ในการยกเลิกฟังก์ชั่นแบบอินไลน์คุณจำเป็นต้องใช้ปีกกาแบบปิดในขณะที่แมโครจะถูกยกเลิกพร้อมกับเริ่มต้นบรรทัดใหม่
- การดีบักเป็นเรื่องง่ายสำหรับฟังก์ชั่น inlne เนื่องจากมีการตรวจสอบระหว่างการรวบรวมเพื่อหาข้อผิดพลาด ในทางกลับกันแมโครจะไม่ถูกตรวจสอบในขณะคอมไพล์ดังนั้นการดีบักแมโครกลายเป็นเรื่องยาก
- เป็นฟังก์ชั่นฟังก์ชั่นอินไลน์ผูกสมาชิกภายในเริ่มต้นและปิดวงเล็บปีกกา ในทางกลับกันแมโครไม่มีสัญลักษณ์การสิ้นสุดดังนั้นการโยงกลายเป็นเรื่องยากเมื่อแมโครมีมากกว่าหนึ่งคำสั่ง
สรุป:
ฟังก์ชั่นแบบอินไลน์มีความน่าเชื่อถือมากกว่าฟังก์ชั่นมาโคร C ++ ยังมีวิธีที่ดีกว่าในการกำหนดค่าคงที่ซึ่งใช้คำหลัก“ const”