สิ่งที่จะใส่ในส่วนหัว:
- ชุด
#include
คำสั่งน้อยที่สุดที่จำเป็นในการทำให้ส่วนหัวคอมไพล์ได้เมื่อส่วนหัวรวมอยู่ในไฟล์ต้นฉบับบางไฟล์
- นิยามสัญลักษณ์ของตัวประมวลผลล่วงหน้าของสิ่งต่าง ๆ ที่จำเป็นต้องแชร์และสามารถทำได้ผ่านทางตัวประมวลผลล่วงหน้าเท่านั้น แม้ใน C สัญลักษณ์ตัวประมวลผลล่วงหน้าจะถูกเก็บไว้อย่างน้อยที่สุด
- การประกาศไปข้างหน้าของโครงสร้างที่จำเป็นในการสร้างคำจำกัดความโครงสร้างต้นแบบฟังก์ชันและการประกาศตัวแปรทั่วโลกในเนื้อความของส่วนหัวที่คอมไพล์ได้
- คำจำกัดความของโครงสร้างข้อมูลและการแจกแจงที่แบ่งใช้ระหว่างไฟล์ต้นฉบับหลายไฟล์
- ประกาศสำหรับฟังก์ชั่นและตัวแปรที่มีคำจำกัดความที่จะปรากฏให้ linker
- นิยามฟังก์ชั่นแบบอินไลน์ แต่ระวังที่นี่
สิ่งที่ไม่ได้อยู่ในส่วนหัว:
#include
แนวทางฟรี การรวมซ้ำนั้นทำให้เกิดการรวบรวมสิ่งที่ไม่จำเป็นต้องคอมไพล์ซ้ำและบางครั้งก็สามารถทำให้ระบบไม่สามารถคอมไพล์ได้ อย่า#include
ไฟล์ในส่วนหัวหากส่วนหัวไม่ต้องการไฟล์ส่วนหัวอื่น ๆ
- สัญลักษณ์ของตัวประมวลผลล่วงหน้าที่มีความตั้งใจสามารถทำได้โดยกลไกบางกลไกกลไกใด ๆ นอกเหนือจากตัวประมวลผลล่วงหน้า
- นิยามโครงสร้างจำนวนมากและมาก แยกออกเป็นส่วนหัวที่แยกจากกัน
- คำจำกัดความแบบอินไลน์ของฟังก์ชั่นที่ต้องการเพิ่มเติม
#include
ซึ่งอาจมีการเปลี่ยนแปลงหรือใหญ่เกินไป ฟังก์ชั่นอินไลน์เหล่านั้นควรมีเพียงเล็กน้อยถ้ามีแฟน ๆ ออกไปและถ้าพวกเขามีแฟนคลับออกมันควรจะถูกแปลเป็นภาษาท้องถิ่นเพื่อสิ่งที่กำหนดไว้ในส่วนหัว
อะไรคือชุดของ#include
ข้อความที่น้อยที่สุด?
สิ่งนี้กลายเป็นคำถามที่ไม่สำคัญ คำจำกัดความ TL; DR: ไฟล์ส่วนหัวจะต้องมีไฟล์ส่วนหัวที่กำหนดประเภทแต่ละประเภทที่ใช้โดยตรงในหรือโดยตรงประกาศแต่ละฟังก์ชั่นที่ใช้ในไฟล์ส่วนหัวที่มีปัญหา แต่ต้องไม่รวมอะไร ประเภทการอ้างอิงตัวชี้หรือ C ++ ไม่ได้รับสิทธิ์เป็นการใช้โดยตรง การอ้างอิงไปข้างหน้าเป็นที่ต้องการ
มีสถานที่สำหรับ#include
คำสั่งฟรีและนี่คือการทดสอบอัตโนมัติ สำหรับไฟล์ส่วนหัวทุกไฟล์ในแพ็คเกจซอฟต์แวร์ฉันสร้างขึ้นโดยอัตโนมัติแล้วรวบรวมสิ่งต่อไปนี้:
#include "path/to/random/header_under_test"
int main () { return 0; }
การรวบรวมควรสะอาด (กล่าวคือปราศจากคำเตือนหรือข้อผิดพลาดใด ๆ ) คำเตือนหรือข้อผิดพลาดเกี่ยวกับประเภทที่ไม่สมบูรณ์หรือประเภทที่ไม่รู้จักหมายความว่าไฟล์ส่วนหัวภายใต้การทดสอบมี#include
คำสั่งที่ขาดหายไปและ / หรือการประกาศไปข้างหน้าหายไป หมายเหตุ: เนื่องจากการทดสอบผ่านไม่ได้หมายความว่าชุด#include
คำสั่งนั้นเพียงพอเพียงเล็กน้อยเท่านั้น