Tệp header trong C là một tệp có phần mở rộng .h chứa các khai báo hàm C và các định nghĩa macro được chia sẻ giữa một số tệp nguồn. Có hai loại tệp tiêu đề: các tệp mà lập trình viên viết và các tệp đi kèm với trình biên dịch.
Để sử dụng một tệp Header trong chương trình C bạn phải sử dụng #include, giống như bạn đã thấy trong các ví dụ của các bài trước, tệp tiêu đề stdio.h, đi kèm với trình biên dịch.
Một thực hành đơn giản trong các chương trình C hoặc C ++ là chúng ta giữ tất cả các hằng số, các macro, các biến toàn cầu của hệ thống và các nguyên mẫu hàm trong các tệp tiêu đề và include tệp tiêu đề đó ở bất kỳ đâu.
Nội dung chính
Cú pháp include
Cả tệp người dùng và tiêu đề hệ thống đều được bao gồm bằng cách sử dụng chỉ thị tiền xử lý #include. Nó có hai dạng sau:
#include <file>
Biểu mẫu này được sử dụng cho tệp tiêu đề hệ thống. Nó tìm kiếm một tệp có tên 'file' trong danh sách thư mục hệ thống tiêu chuẩn. Bạn có thể thêm các thư mục vào danh sách này với tùy chọn -I trong khi biên dịch mã nguồn.
#include "file"
Biểu mẫu này được sử dụng cho các tệp tiêu đề của chương trình do người dùng định nghĩa. Nó tìm kiếm tệp có tên 'file' trong thư mục chứa tệp hiện tại. Bạn có thể thêm các thư mục vào danh sách này với tùy chọn -I trong khi biên dịch mã nguồn.
Hoạt động của include
Lệnh #include hoạt động bằng cách chỉ thị bộ tiền xử lý C để quét tệp được chỉ định làm đầu vào trước khi tiếp tục với phần còn lại của tệp nguồn hiện tại. Đầu ra từ bộ tiền xử lý chứa đầu ra đã được tạo ra, tiếp theo là kết quả đầu ra từ tệp được bao gồm, theo sau là đầu ra xuất phát từ văn bản sau chỉ thị #include . Ví dụ: nếu bạn có tiêu đề tệp header.h như sau:
char *test (void);
Và một chương trình chính được gọi là program.c sử dụng tệp tiêu đề, như sau:
int x; #include "header.h" int main (void) { puts (test ()); }
Trình biên dịch sẽ dịch program.c như sau:
int x; char *test (void); int main (void) { puts (test ()); }
Chỉ được khai báo tệp header một lần
Nếu bạn include một tệp tieu đề 2 lần, trình biên dịch sẽ xử lý nội dung của nó hai lần và nó sẽ dẫn đến một lỗi. Cách tiêu chuẩn để ngăn chặn điều này là gửi kèm toàn bộ nội dung thực của tệp trong một điều kiện.
#ifndef HEADER_FILE #define HEADER_FILE // toan bo tep header #endif
Cấu trúc này thường được gọi là trình bao bọc #ifndef . Khi tiêu đề được bao gồm một lần nữa, điều kiện sẽ là sai, bởi vì HEADER_FILE được xác định. Bộ tiền xử lý sẽ bỏ qua toàn bộ nội dung của tệp và trình biên dịch sẽ không nhìn thấy nó hai lần.
Include được tính toán
Đôi khi nó là cần thiết để chọn một trong các tập tin tiêu đề khác nhau để được đưa vào chương trình của bạn. Ví dụ, họ có thể chỉ định các tham số cấu hình được sử dụng trên các loại hệ điều hành khác nhau. Bạn có thể làm điều này với một loạt các điều kiện như sau:
#if SYSTEM_1 # include "system_1.h" #elif SYSTEM_2 # include "system_2.h" #elif SYSTEM_3 ... #endif
Nhưng khi nó phát triển, nó trở nên tẻ nhạt, thay vào đó bộ tiền xử lý cung cấp khả năng sử dụng macro cho tên tiêu đề. Điều này được gọi là include được tính toán. Thay vì viết tên tiêu đề làm đối số trực tiếp của #include , bạn chỉ cần đặt tên macro ở đó:
#define SYSTEM_H "system_1.h" ... #include SYSTEM_H
SYSTEM_H sẽ được mở rộng và bộ tiền xử lý sẽ tìm kiếm system_1.h. SYSTEM_H có thể được định nghĩa bởi Makefile của bạn với tùy chọn -D.