ขั้นแรกเพื่อตอบคำถามแรกของคุณ:
เมื่อคุณเห็นสิ่งนี้ในไฟล์. h :
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
นี่เป็นเทคนิคตัวประมวลผลล่วงหน้าในการป้องกันไฟล์ส่วนหัวรวมอยู่หลายครั้งซึ่งอาจเป็นปัญหาได้จากหลายสาเหตุ ในระหว่างการรวบรวมโครงการของคุณไฟล์. cppแต่ละไฟล์ (โดยปกติ) จะถูกรวบรวม กล่าวง่ายๆว่าแปลว่าคอมไพเลอร์จะนำไฟล์. cppของคุณเปิดไฟล์ใด ๆ#included
เชื่อมต่อพวกเขาทั้งหมดเป็นไฟล์ข้อความขนาดใหญ่หนึ่งไฟล์จากนั้นทำการวิเคราะห์ไวยากรณ์และในที่สุดมันก็จะแปลงเป็นรหัสกลางบางส่วน งานและในที่สุดก็สร้างเอาท์พุทการชุมนุมสำหรับสถาปัตยกรรมเป้าหมาย ด้วยเหตุนี้หากไฟล์นั้นมี#included
หลายครั้งภายใต้. cppเดียวไฟล์คอมไพเลอร์จะต่อท้ายเนื้อหาของไฟล์สองครั้งดังนั้นหากมีคำจำกัดความในไฟล์นั้นคุณจะได้รับข้อผิดพลาดของคอมไพเลอร์ที่บอกคุณว่าคุณได้นิยามตัวแปรใหม่ เมื่อไฟล์ถูกประมวลผลโดยขั้นตอนตัวประมวลผลล่วงหน้าในกระบวนการรวบรวมครั้งแรกที่เนื้อหาของมันถึงสองบรรทัดแรกจะตรวจสอบว่าFILE_H
มีการกำหนดไว้สำหรับตัวประมวลผลล่วงหน้า ถ้าไม่มันจะกำหนดFILE_H
และดำเนินการประมวลผลรหัสระหว่างมันและ#endif
คำสั่ง ครั้งต่อไปที่ตัวประมวลผลล่วงหน้าเห็นเนื้อหาของไฟล์การตรวจสอบFILE_H
จะเป็นเท็จดังนั้นมันจะสแกนลงไปที่ไฟล์#endif
และดำเนินการต่อหลังจากนั้น สิ่งนี้จะป้องกันข้อผิดพลาดในการกำหนดซ้ำ
และเพื่อแก้ไขข้อกังวลที่สองของคุณ:
ในการเขียนโปรแกรม C ++ ตามหลักปฏิบัติทั่วไปเราแยกการพัฒนาออกเป็นสองประเภทไฟล์ หนึ่งอยู่กับส่วนขยายของ. hและเราเรียกสิ่งนี้ว่า "ไฟล์ส่วนหัว" พวกเขามักจะให้การประกาศของฟังก์ชั่น, ชั้นเรียน, structs, ตัวแปรทั่วโลก, พิมพ์, มาโครการประมวลผลล่วงหน้าและคำจำกัดความ ฯลฯ โดยทั่วไปพวกเขาเพียงแค่ให้ข้อมูลเกี่ยวกับรหัสของคุณ จากนั้นเรามีนามสกุล. cppซึ่งเราเรียกว่า "รหัสไฟล์" สิ่งนี้จะให้คำจำกัดความสำหรับฟังก์ชั่นเหล่านั้นสมาชิกคลาสสมาชิกโครงสร้างใด ๆ ที่ต้องการคำนิยามตัวแปรทั่วโลก ฯลฯ ดังนั้นไฟล์. hประกาศรหัสและไฟล์. cppจะดำเนินการประกาศนั้น ด้วยเหตุนี้เราโดยทั่วไปในระหว่างการคอมไพล์คอมไพล์แต่ละ. cppไฟล์ลงในวัตถุแล้วเชื่อมโยงวัตถุเหล่านั้น (เพราะคุณแทบจะไม่เคยเห็นไฟล์. cppไฟล์ใดไฟล์หนึ่งรวมไฟล์. cppอื่น)
วิธีแก้ไขปัญหา externals เหล่านี้เป็นงานสำหรับ linker เมื่อคอมไพเลอร์ของคุณประมวลผลmain.cppจะได้รับการประกาศสำหรับรหัสในclass.cppโดยรวมclass.h เพียงต้องการทราบว่าฟังก์ชั่นหรือตัวแปรเหล่านี้มีลักษณะอย่างไร (ซึ่งเป็นสิ่งที่ประกาศให้คุณ) ดังนั้นจึงรวบรวมไฟล์ main.cppของคุณเป็นไฟล์ออบเจ็กต์ (เรียกว่าmain.obj ) ในทำนองเดียวกันclass.cppจะถูกรวบรวมเป็นclass.objไฟล์. ในการสร้างไฟล์เรียกทำงานขั้นสุดท้ายตัวลิงก์จะถูกเรียกใช้เพื่อลิงก์ไฟล์อ็อบเจ็กต์ทั้งสองเข้าด้วยกัน สำหรับตัวแปรหรือฟังก์ชั่นภายนอกที่ยังไม่ได้แก้ไขคอมไพเลอร์จะวางต้นขั้วซึ่งการเข้าถึงเกิดขึ้น ตัวเชื่อมโยงจะใช้ต้นขั้วนี้และมองหารหัสหรือตัวแปรในวัตถุไฟล์อื่นที่อยู่ในรายการและหากพบมันจะรวมรหัสจากไฟล์วัตถุสองไฟล์เป็นไฟล์เอาต์พุตและแทนที่ต้นขั้วด้วยตำแหน่งสุดท้ายของฟังก์ชันหรือ ตัวแปร. วิธีนี้รหัสของคุณใน main.cpp สามารถเรียกฟังก์ชั่นและตัวแปรการใช้งานในclass.cppและถ้าหากพวกเขาจะประกาศในclass.h
ฉันหวังว่านี่จะเป็นประโยชน์