Header Files ไฟล์ส่วนหัว ภาษา C
ไฟล์ส่วนหัวเป็นไฟล์ที่มีนามสกุล .h ซึ่งมีการประกาศฟังก์ชัน C และคำจำกัดความของมาโครที่จะแชร์ระหว่างไฟล์ต้นทางหลายไฟล์ ไฟล์ส่วนหัวมีสองประเภท: ไฟล์ที่โปรแกรมเมอร์เขียนและไฟล์ที่มาพร้อมกับคอมไพเลอร์ของคุณ
คุณขอใช้ไฟล์ส่วนหัวในโปรแกรมของคุณโดยรวมเข้ากับคำสั่ง พรีโปรเซสเซอร์ #include เช่นเดียวกับที่คุณเคยเห็นการรวมไฟล์ส่วนหัว stdio.h ซึ่งมาพร้อมกับคอมไพเลอร์ของคุณ
การรวมไฟล์ส่วนหัวเท่ากับการคัดลอกเนื้อหาของไฟล์ส่วนหัว แต่เราไม่ทำเพราะจะเกิดข้อผิดพลาดได้ง่ายและไม่ควรคัดลอกเนื้อหาของไฟล์ส่วนหัวในไฟล์ต้นฉบับโดยเฉพาะถ้าเรา มีไฟล์ต้นฉบับหลายไฟล์ในโปรแกรม
แนวทางปฏิบัติง่ายๆ ในโปรแกรม C หรือ C++ คือเราเก็บค่าคงที่ มาโคร ตัวแปรส่วนกลางทั้งระบบ และต้นแบบฟังก์ชันในไฟล์ส่วนหัวและรวมไฟล์ส่วนหัวนั้นไว้ทุกที่ที่ต้องการ
Include Syntax
ทั้งผู้ใช้และส่วนหัวของไฟล์ระบบที่จะถูกรวมโดยใช้คำสั่ง พรีโปรเซสเซอร์ C #include มีสองรูปแบบดังต่อไปนี้ −
#include <file>
รูปแบบนี้ใช้สำหรับไฟล์ส่วนหัวของระบบ มันค้นหาไฟล์ชื่อ ‘file’ ในรายการไดเร็กทอรีระบบมาตรฐาน
#include "file"
รูปแบบนี้ใช้สำหรับไฟล์ส่วนหัวของโปรแกรมของคุณเอง มันค้นหาไฟล์ชื่อ ‘file’ ในไดเร็กทอรีที่มีไฟล์ปัจจุบัน
Include Operation
#include งานสั่งโดยการกำกับ พรีโปรเซสเซอร์ C ในการสแกนไฟล์ที่ระบุเป็นข้อมูลก่อนดำเนินการต่อกับส่วนที่เหลือของแฟ้มแหล่งที่มาในปัจจุบัน เอาต์พุตจากตัวประมวลผลล่วงหน้ามีเอาต์พุตที่สร้างไว้แล้ว ตามด้วยเอาต์พุตที่เป็นผลจากไฟล์ที่รวม ตามด้วยเอาต์พุตที่มาจากข้อความหลังคำสั่ง #include ตัวอย่างเช่น หากคุณมีไฟล์ส่วนหัว header.h ดังนี้ −
char *test (void);
และโปรแกรมหลักชื่อ program.c ซึ่งใช้ไฟล์ส่วนหัวแบบนี้
int x;
#include "header.h"
int main (void) {
puts (test ());
}
คอมไพเลอร์จะเห็นสตรีมโทเค็นเหมือนกันกับที่ program.c อ่าน
int x;
char *test (void);
int main (void) {
puts (test ());
}
Once-Only Headers
หากมีการรวมไฟล์ส่วนหัวสองครั้ง คอมไพเลอร์จะประมวลผลเนื้อหาสองครั้ง และจะส่งผลให้เกิดข้อผิดพลาด วิธีมาตรฐานในการป้องกันสิ่งนี้คือการใส่เนื้อหาจริงทั้งหมดของไฟล์แบบมีเงื่อนไขดังนี้:
#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
โครงสร้างนี้เป็นที่รู้จักกันทั่วไปว่าเป็นเสื้อคลุมคำสั่ง #ifdefเมื่อรวมส่วนหัวอีกครั้ง เงื่อนไขจะเป็นเท็จ เนื่องจากมีการกำหนด HEADER_FILE ตัวประมวลผลล่วงหน้าจะข้ามเนื้อหาทั้งหมดของไฟล์ และคอมไพเลอร์จะไม่เห็นมันอีกสองครั้ง
Computed Includes
บางครั้งจำเป็นต้องเลือกไฟล์ส่วนหัวที่แตกต่างกันหลายไฟล์เพื่อรวมไว้ในโปรแกรมของคุณ ตัวอย่างเช่น อาจระบุพารามิเตอร์การกำหนดค่าเพื่อใช้กับระบบปฏิบัติการประเภทต่างๆ คุณสามารถทำได้ด้วยชุดเงื่อนไขดังต่อไปนี้ −
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
แต่เมื่อเติบโตขึ้น ก็กลายเป็นเรื่องน่าเบื่อ แทนตัวประมวลผลล่วงหน้าให้ความสามารถในการใช้มาโครสำหรับชื่อส่วนหัว นี้เรียกว่าcomputed include ได้แก่ แทนที่จะเขียนชื่อส่วนหัวเป็นอาร์กิวเมนต์โดยตรงของ #include คุณเพียงแค่ใส่ชื่อมาโครที่นั่น −
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H จะถูกขยาย และตัวประมวลผลล่วงหน้าจะค้นหา system_1.h ราวกับว่า #include ถูกเขียนแบบนั้นในตอนแรก SYSTEM_H สามารถกำหนดโดย Makefile ของคุณด้วยตัวเลือก -D