Include guard
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 2 trên 61.
Khi một tệp tiêu đề được đưa vào nhiều lần trong dự án, trình biên dịch sẽ gặp lại các khai báo giống nhau, gây ra lỗi. Điều này thường xảy ra khi nhiều tệp đưa vào cùng một tệp tiêu đề hoặc khi các tệp tiêu đề đưa vào lẫn nhau. Include guard giúp giải quyết vấn đề này.
Include guard sử dụng ba chỉ thị tiền xử lý để đảm bảo nội dung của tệp tiêu đề chỉ được xử lý một lần:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
Cách hoạt động như sau: #ifndef MATH_UTILS_H kiểm tra xem ký hiệu MATH_UTILS_H đã được định nghĩa chưa. Nếu chưa, bộ tiền xử lý sẽ tiếp tục và định nghĩa ký hiệu đó ngay bằng #define MATH_UTILS_H. Mọi thứ từ đây đến #endif đều được đưa vào quá trình biên dịch.
Khi tệp tiêu đề này được đưa vào lần thứ hai, MATH_UTILS_H đã được định nghĩa, nên toàn bộ khối lệnh sẽ bị bỏ qua. Tên của macro bảo vệ thường là tên tệp viết hoa, với dấu chấm và ký tự đặc biệt được thay bằng dấu gạch dưới.
Mọi tệp tiêu đề bạn tạo đều cần có include guard. Đây là cách làm tiêu chuẩn giúp ngăn lỗi biên dịch và cho phép bạn an toàn include tệp đó ở bất cứ đâu trong dự án.
Thử thách
DễHãy bảo vệ tệp tiêu đề khỏi việc được đưa vào nhiều lần bằng cách thêm các include guard. Bạn sẽ dựa trên tiện ích chào hỏi từ bài học trước, nhưng lần này hãy đảm bảo tệp tiêu đề có thể được đưa vào nhiều lần một cách an toàn.
Bạn sẽ tạo hai tệp:
greet.h: Tệp tiêu đề chứa khai báo hàm chogreet. Lần này, hãy bao toàn bộ nội dung bằng include guard sử dụng ký hiệuGREET_H.main.c: Tệp chính của bạn, đưa tệp tiêu đề vào, triển khai hàmgreetvà gọi hàm này từmain().
Hàm greet nên nhận một tham số const char* cho tên và in ra:
Hello, Alice!Tệp tiêu đề của bạn nên theo cấu trúc sau:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifBạn sẽ nhận một đầu vào: một tên (chuỗi).
In chính xác lời chào theo định dạng ở trên, thay Alice bằng tên được cung cấp.
Tự làm thử
#include <stdio.h>
#include "greet.h"
// TODO: Viết hàm (function) greet để in ra "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: Gọi hàm greet với name
return 0;
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online