Include guard trong C và C++
C/C++
5
C
27
C++
27
White

Võ Phi Hùng viết ngày 30/03/2017

Khi làm quen với C hoặc C++ chắc bạn sẽ rất quen với mấy dòng kiểu như sau ở đầu và cuối mỗi file .h

#ifndef  _file_name_h
#define _file_name_h

/* file content */

#endif

Những dòng trên được gọi là Include Guard (thực ra chính xác hơn là #include guard) đến đây thì bạn cũng lờ mờ đoán ra mớ code nhiều dấu thăng ở trên để làm cái gì rồi. Đại khái là nó sẽ để bảo vệ cho đồng chí #include mà các bạn sẽ dùng để import file khác vào. Vậy tại sao lại phải bảo vệ. Đê biết được tác dụng của nó chúng ta sẽ xét đến ví dụ không có Include Guard sau.

File "AV.h"

struct star {
    int age;
};

File "AsianAV.h"

#include "AV.h"

File "JAV.h"

#include "AV.h"
#include "AsianAV.h"

Ở đây bạn sẽ gặp lỗi khi cố biên dịch file JAV.h vì nó đã vô tình include 2 lần file "AV.h" và cùng với đó thì kiểu struct start cũng sẽ được define 2 lần. Điều này rõ ràng là sẽ gây ra lỗi. Đến đây thì chúng ta sẽ thêm Include Guard vào file AV.h để sửa lỗi này

New "AV.h"

#ifndef  _av_h_
#define _av_h_ 

struct star {
    int age;
};

#endif

Lần này thì lỗi sẽ không hỏi thăm chúng ta nữa. Nhưng hãy làm rõ mấy câu lệnh đơn giản trên 1 chút. Đầu tiên câu lệnh #ifndef _av_h_ sẽ kiểm tra xem đã có cái nào tên là _av_h_ được định nghĩa chưa.

  • Nếu chưa thì sẽ chạy tiếp các câu lệnh ở dưới là #define _av_h_ sẽ định nghĩa cái tên _av_h_. Sau đó thì mọi thứ diễn ra bình thường.
  • Nếu đã được định nghĩa (việc này xảy ra khi bạn include file av.h lần thứ 2) thì trình biên dịch sẽ nhảy luôn xuống lệnh #endif và lúc này lệnh #include sẽ không khác gì hơn ngoài include 1 file trống.

Đó là cơ chế mà Include Guard hoạt động. Nếu bạn thấy hay và hữu ích, đừng quên like và tín dụng cùng comment cho tác giả để tác giả có thêm ham muốn để viết tiếp nhiều bài nữa.

Update: Các bạn có thể dùng #pragma để thay thế cho include guard bằng cách viết

#pragma once

// header file code

directive này hầu hết được hỗ trợ bởi các compiler lớn bao gồm Clang, GCC, the Intel C++ compiler và MSVC.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Võ Phi Hùng

6 bài viết.
32 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
13 5
Bài này được mình dịch lại từ bài gốc ở đây. http://www.joelonsoftware.com/articles/fog0000000069.html Của tác giả Joel Spolsky thuộc công ty Netsc...
Võ Phi Hùng viết hơn 2 năm trước
13 5
White
8 2
Khái niệm macro và ví dụ Macro một cái tên nghe khá hổ báo, được dùng để chỉ những hàm được viết ở phần Preprocessor, thay vì đặt nó vào trong phầ...
Võ Phi Hùng viết hơn 2 năm trước
8 2
White
8 2
Từ khoá virtual có một số đặc tính khá thú vị mà mình muốn chia sẻ với các đồng chí ngày hôm nay. Bài viết có vẻ hơi dài hơn mức cần thiết nhưng đừ...
Võ Phi Hùng viết hơn 2 năm trước
8 2
Bài viết liên quan
White
26 3
simplehttp à một source viết bởi bitly : https://github.com/bitly/simplehttp Như các bạn thấy các từ simple, bit : đơn giản và nhỏ bé thôi, đừng t...
dungcoi viết hơn 2 năm trước
26 3
Male avatar
11 6
P/s: Tài liệu này được mình viết bằng Japanese Version cách đây 6 tháng nên có 1 số hình ảnh có lẽ là chưa giống với hiện tại nhưng mà mình cũng ng...
Chu Chu viết hơn 2 năm trước
11 6
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
32 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!