[C/C++] Include guard trong C và C++

Include guard trong C

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 thư viện .h

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”

File “AsianAV.h”

File “JAV.h”

Ở đây bạn sẽ gặp lỗi khi cố biên dịch file  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”

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. Rất hay đúng không? :)

Từ kipalog.com

Leave a Reply

1 Comment on "[C/C++] Include guard trong C và C++"

Notify of
avatar
Sort by:   newest | oldest | most voted
trackback

[…] Trong đoạn code vừa rồi macro SIZE sẽ được kiểm tra xem là đã được định nghĩa ở đâu đó chưa. Nếu chưa thì sẽ thực hiện câu lệnh #define SIZE 100. Sau đó chương trình dịch tiếp như bình thường. Các bạn có thể xem thêm về việc dùng ifdef và ifndef ở bài viết về Include Guard […]

wpDiscuz