คำอธิบายโดยละเอียดของไฟล์ส่วนหัวและไฟล์ต้นฉบับใน C ++
1. โหมดการรวบรวม C ++
โดยทั่วไปในโปรแกรม C ++ มีไฟล์เพียงสองประเภทเท่านั้น - ไฟล์. CPP และไฟล์. h ในหมู่พวกเขาไฟล์. cpp เรียกว่าไฟล์ต้นฉบับ C ++ และซอร์สโค้ดของ C ++ ถูกวางไว้ในนั้น ในขณะที่ไฟล์. h ถูกเรียกว่าไฟล์ส่วนหัว C ++ และซอร์สโค้ดของ C ++ จะถูกวางไว้ในนั้น
ภาษา C ++ รองรับ "การรวบรวมแยก" กล่าวอีกนัยหนึ่งเนื้อหาทั้งหมดของโปรแกรมสามารถแบ่งออกเป็นส่วนต่าง ๆ และวางไว้ในไฟล์. CPP ที่แตกต่างกัน สิ่งต่าง ๆ ในไฟล์. cpp นั้นค่อนข้างอิสระ เมื่อรวบรวม (คอมไพล์) คุณไม่จำเป็นต้องสื่อสารกับไฟล์อื่น ๆ คุณจะต้องเชื่อมโยงกับไฟล์เป้าหมายอื่น ๆ หลังจากรวบรวมไว้ในไฟล์เป้าหมาย ตัวอย่างเช่นฟังก์ชั่นส่วนกลาง "เป็นโมฆะ () {}" ถูกกำหนดไว้ในไฟล์ A.CPP และฟังก์ชั่นนี้จะต้องมีการเรียกในไฟล์ b.cpp ถึงกระนั้นไฟล์ A.CPP และ B.CPP ก็ไม่จำเป็นต้องรู้การดำรงอยู่ของกันและกัน แต่สามารถรวบรวมได้แยกต่างหาก หลังจากรวบรวมไว้ในไฟล์เป้าหมายลิงก์และโปรแกรมทั้งหมดสามารถเรียกใช้ได้
สิ่งนี้ประสบความสำเร็จได้อย่างไร? จากมุมมองของโปรแกรมการเขียนมันง่ายมาก ในไฟล์ B.CPP ก่อนที่จะเรียกฟังก์ชั่น "void a ()" ประกาศฟังก์ชั่น "void a ();" อันดับแรก. นี่เป็นเพราะคอมไพเลอร์จะสร้างตารางสัญลักษณ์เมื่อรวบรวม b.cpp สัญลักษณ์เช่น "void a ()" ที่ไม่สามารถมองเห็นได้จะถูกเก็บไว้ในตารางนี้ เมื่อเชื่อมโยงอีกครั้งคอมไพเลอร์จะค้นหาคำจำกัดความของสัญลักษณ์นี้ในไฟล์วัตถุอื่น เมื่อพบแล้วโปรแกรมสามารถสร้างได้อย่างราบรื่น
โปรดทราบว่ามีสองแนวคิดที่กล่าวถึงที่นี่หนึ่งคือ "คำจำกัดความ" และอีกแนวคิดหนึ่งคือ "การประกาศ" พูดง่ายๆคือ "คำจำกัดความ" หมายถึงการอธิบายสัญลักษณ์ในวิธีที่สมบูรณ์และสมบูรณ์: ไม่ว่าจะเป็นตัวแปรหรือฟังก์ชั่นประเภทใดที่มันกลับมาพารามิเตอร์ที่ต้องการ ฯลฯ "การประกาศ" เพียงแค่ประกาศการมีอยู่ของสัญลักษณ์นี้นั่นคือบอกคอมไพเลอร์ว่าสัญลักษณ์นี้ถูกกำหนดไว้ในไฟล์อื่น ฉันจะใช้มันก่อน เมื่อคุณเชื่อมโยงไปที่อื่นเพื่อค้นหาว่ามันคืออะไร เมื่อกำหนดคุณต้องกำหนดสัญลักษณ์ (ตัวแปรหรือฟังก์ชั่น) อย่างสมบูรณ์ตามไวยากรณ์ C ++ และเมื่อประกาศคุณจะต้องเขียนต้นแบบของสัญลักษณ์นี้เท่านั้น ควรสังเกตว่าสัญลักษณ์สามารถประกาศได้หลายครั้งตลอดทั้งโปรแกรม แต่ต้องกำหนดเพียงครั้งเดียว แค่คิดว่าถ้ามีคำจำกัดความที่แตกต่างกันสองประการของสัญลักษณ์คอมไพเลอร์ควรฟังใคร
กลไกนี้นำประโยชน์มากมายให้กับโปรแกรมเมอร์ C ++ และยังนำไปสู่วิธีการเขียนโปรแกรม พิจารณาว่าหากมีฟังก์ชั่นที่ใช้กันทั่วไป "void f () {}" ที่จะถูกเรียกในไฟล์. cpp จำนวนมากในโปรแกรมทั้งหมดเราต้องกำหนดฟังก์ชั่นนี้ในไฟล์เดียวและประกาศฟังก์ชั่นนี้ในไฟล์อื่น ๆ ฟังก์ชั่นนั้นง่ายต่อการจัดการและมันหมายถึงเพียงหนึ่งประโยคที่จะประกาศ อย่างไรก็ตามถ้ามีฟังก์ชั่นมากเกินไปเช่นฟังก์ชั่นทางคณิตศาสตร์จำนวนมากมีหลายร้อยรายการ? โปรแกรมเมอร์ทุกคนสามารถเขียนและเขียนฟังก์ชั่นทั้งหมดในรูปแบบของพวกเขาได้หรือไม่?
2. ไฟล์ส่วนหัวคืออะไร
เห็นได้ชัดว่าคำตอบนั้นเป็นไปไม่ได้ แต่มีวิธีที่ง่ายมากในการช่วยให้โปรแกรมเมอร์บันทึกปัญหาของการจดจำต้นแบบฟังก์ชั่นจำนวนมาก: เราสามารถเขียนคำแถลงทั้งหมดของฟังก์ชั่นหลายร้อยฟังก์ชั่นก่อนและวางไว้ในไฟล์ เมื่อโปรแกรมเมอร์ต้องการพวกเขาให้คัดลอกสิ่งเหล่านี้ทั้งหมดลงในซอร์สโค้ดของเขา