ในขณะที่คุณสามารถรวม.cppไฟล์ได้ตามที่คุณกล่าวถึงนี่เป็นความคิดที่ไม่ดี
ตามที่คุณกล่าวไว้การประกาศจะอยู่ในไฟล์ส่วนหัว สิ่งเหล่านี้ทำให้ไม่มีปัญหาเมื่อรวมอยู่ในหลายหน่วยการคอมไพล์เพราะพวกเขาไม่รวมการใช้งาน การรวมคำจำกัดความของฟังก์ชั่นหรือสมาชิกคลาสหลายครั้งมักจะทำให้เกิดปัญหา (แต่ไม่เสมอไป) เพราะตัวเชื่อมโยงจะสับสนและทำให้เกิดข้อผิดพลาด
สิ่งที่ควรเกิดขึ้นคือแต่ละ.cppไฟล์มีคำจำกัดความสำหรับชุดย่อยของโปรแกรมเช่นคลาสกลุ่มฟังก์ชันที่มีการจัดระบบแบบโลจิคัลตัวแปรสแตติกโกลบอล (ใช้เท่าที่จำเป็น)
แต่ละหน่วยการรวบรวม ( .cppไฟล์) จากนั้นรวมถึงการประกาศใด ๆ ที่จำเป็นต้องรวบรวมคำจำกัดความที่มีอยู่ มันติดตามฟังก์ชั่นและการเรียนมันอ้างอิง แต่ไม่ได้มีดังนั้น linker สามารถแก้ไขได้ในภายหลังเมื่อมันรวมรหัสวัตถุลงในปฏิบัติการหรือห้องสมุด
ตัวอย่าง
Foo.h -> มีการประกาศ (อินเทอร์เฟซ) สำหรับคลาส Foo
Foo.cpp -> มีคำจำกัดความ (การนำไปใช้) สำหรับคลาส Foo
Main.cpp-> มีวิธีการหลักจุดเข้าใช้โปรแกรม รหัสนี้จะยกตัวอย่าง Foo และใช้มัน
ทั้งสองFoo.cppและจำเป็นจะต้องรวมMain.cpp จำเป็นต้องใช้เพราะมีการกำหนดรหัสที่ด้านหลังอินเทอร์เฟซของคลาสดังนั้นจึงจำเป็นต้องทราบว่าอินเทอร์เฟซนั้นคืออะไร ต้องการมันเพราะมันกำลังสร้าง Foo และเรียกใช้พฤติกรรมดังนั้นจึงต้องรู้ว่าพฤติกรรมนั้นคืออะไรขนาดของ Foo ในหน่วยความจำและวิธีการค้นหาฟังก์ชั่น ฯลฯ แต่ยังไม่จำเป็นต้องมีการใช้งานจริงFoo.hFoo.cppMain.cpp
คอมไพเลอร์จะสร้างFoo.oจากFoo.cppที่มีรหัสคลาส Foo ทั้งหมดในรูปแบบที่รวบรวม นอกจากนี้ยังสร้างMain.oซึ่งรวมถึงวิธีการหลักและการอ้างอิงที่ยังไม่ได้แก้ไขกับคลาสฟู
ตอนนี้ตัวเชื่อมโยงมาซึ่งรวมสองวัตถุไฟล์Foo.oและMain.oเป็นไฟล์ปฏิบัติการ มันเห็นการอ้างอิงของ Foo ที่ไม่ได้รับการแก้ไขMain.oแต่เห็นว่าFoo.oมีสัญลักษณ์ที่จำเป็นดังนั้นจึง "เชื่อมต่อจุด" เพื่อพูด Main.oตอนนี้การเรียกใช้ฟังก์ชันเชื่อมต่อกับตำแหน่งจริงของรหัสที่คอมไพล์แล้วดังนั้นในขณะรันไทม์โปรแกรมสามารถข้ามไปยังตำแหน่งที่ถูกต้องได้
หากคุณรวมFoo.cppไฟล์ไว้ในMain.cppนั้นจะมีคำจำกัดความของคลาสฟูสองคำจำกัดความ ตัวเชื่อมโยงจะเห็นสิ่งนี้และพูดว่า "ฉันไม่รู้ว่าจะเลือกอันไหนดังนั้นนี่เป็นข้อผิดพลาด" ขั้นตอนการรวบรวมจะสำเร็จ แต่การเชื่อมโยงจะไม่ (เว้นแต่คุณจะไม่ได้รวบรวมFoo.cppแต่ทำไมมันเป็น.cppไฟล์แยกต่างหาก)
สุดท้ายแนวคิดของไฟล์ประเภทต่าง ๆ นั้นไม่เกี่ยวข้องกับคอมไพเลอร์ C / C ++ มันรวบรวม "ไฟล์ข้อความ" ซึ่งหวังว่าจะมีรหัสที่ถูกต้องสำหรับภาษาที่ต้องการ บางครั้งมันอาจสามารถบอกภาษาตามนามสกุลไฟล์ ตัวอย่างเช่นคอมไพล์.cไฟล์ที่ไม่มีตัวเลือกคอมไพเลอร์และมันจะถือว่า C ในขณะที่ส่วนขยาย.ccหรือ.cppส่วนขยายจะบอกให้ถือว่า C ++ อย่างไรก็ตามฉันสามารถบอกคอมไพเลอร์ให้รวบรวมไฟล์ได้อย่างง่ายดาย.hหรือแม้แต่.docxเป็น C ++ และมันจะปล่อย.oไฟล์object ( ) ถ้ามันมีรหัส C ++ ที่ถูกต้องในรูปแบบข้อความธรรมดา ส่วนขยายเหล่านี้เพิ่มเติมเพื่อประโยชน์ของโปรแกรมเมอร์ ถ้าฉันเห็นFoo.hและFoo.cppฉันทันทีถือว่าแรกที่มีการประกาศของชั้นเรียนและที่สองมีคำจำกัดความ