ในขณะที่คุณสามารถรวม.cpp
ไฟล์ได้ตามที่คุณกล่าวถึงนี่เป็นความคิดที่ไม่ดี
ตามที่คุณกล่าวไว้การประกาศจะอยู่ในไฟล์ส่วนหัว สิ่งเหล่านี้ทำให้ไม่มีปัญหาเมื่อรวมอยู่ในหลายหน่วยการคอมไพล์เพราะพวกเขาไม่รวมการใช้งาน การรวมคำจำกัดความของฟังก์ชั่นหรือสมาชิกคลาสหลายครั้งมักจะทำให้เกิดปัญหา (แต่ไม่เสมอไป) เพราะตัวเชื่อมโยงจะสับสนและทำให้เกิดข้อผิดพลาด
สิ่งที่ควรเกิดขึ้นคือแต่ละ.cpp
ไฟล์มีคำจำกัดความสำหรับชุดย่อยของโปรแกรมเช่นคลาสกลุ่มฟังก์ชันที่มีการจัดระบบแบบโลจิคัลตัวแปรสแตติกโกลบอล (ใช้เท่าที่จำเป็น)
แต่ละหน่วยการรวบรวม ( .cpp
ไฟล์) จากนั้นรวมถึงการประกาศใด ๆ ที่จำเป็นต้องรวบรวมคำจำกัดความที่มีอยู่ มันติดตามฟังก์ชั่นและการเรียนมันอ้างอิง แต่ไม่ได้มีดังนั้น linker สามารถแก้ไขได้ในภายหลังเมื่อมันรวมรหัสวัตถุลงในปฏิบัติการหรือห้องสมุด
ตัวอย่าง
Foo.h
-> มีการประกาศ (อินเทอร์เฟซ) สำหรับคลาส Foo
Foo.cpp
-> มีคำจำกัดความ (การนำไปใช้) สำหรับคลาส Foo
Main.cpp
-> มีวิธีการหลักจุดเข้าใช้โปรแกรม รหัสนี้จะยกตัวอย่าง Foo และใช้มัน
ทั้งสองFoo.cpp
และจำเป็นจะต้องรวมMain.cpp
จำเป็นต้องใช้เพราะมีการกำหนดรหัสที่ด้านหลังอินเทอร์เฟซของคลาสดังนั้นจึงจำเป็นต้องทราบว่าอินเทอร์เฟซนั้นคืออะไร ต้องการมันเพราะมันกำลังสร้าง Foo และเรียกใช้พฤติกรรมดังนั้นจึงต้องรู้ว่าพฤติกรรมนั้นคืออะไรขนาดของ Foo ในหน่วยความจำและวิธีการค้นหาฟังก์ชั่น ฯลฯ แต่ยังไม่จำเป็นต้องมีการใช้งานจริงFoo.h
Foo.cpp
Main.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
ฉันทันทีถือว่าแรกที่มีการประกาศของชั้นเรียนและที่สองมีคำจำกัดความ