Menu
CoddyTech

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.

challenge icon

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 cho greet. Lần này, hãy bao toàn bộ nội dung bằng include guard sử dụng ký hiệu GREET_H.
  • main.c: Tệp chính của bạn, đưa tệp tiêu đề vào, triển khai hàm greet và 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

#endif

Bạ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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online