C++ Nâng Cao. Tìm Hiểu Về Header Guard

Hello. Xin chào các bạn. Một ngày mới tốt lành. Chủ đề học lập trình c++ nâng cao.

 

Hôm nay chúng ta hãy cùng tìm hiểu về header guard trong c++.

Đây là một kỹ thuật được sử dụng nhiều khi bắt đầu khai báo một file header.

1. Đặt Vấn Đề Vì Sao Cần Dùng Header Guard

Giả sử các bạn định nghĩa một hàm tính tổng 2 số trong file tiêu đề A như sau.

int Sum (const int& a,  const int& b) {return a + b}

Sau đó bạn gọi include file A trong file B,

Trong file Main chúng ta include cả A và B.

Khi file Main include file A  => Nó sẽ thực hiện định nghĩa  Sum có trong A ở file Main.

Sau đó file Main gọi đến file B. Mà file B lại include file A.

=> Nên Sum được định nghĩa trong A sẽ được định nghĩa tiếp trong B.

=> Sau đó lại được định nghĩa tiếp trong Main khi Main gọi B.

Như vậy Hàm Sum được khởi tạo và định nghĩa lại quá nhiều lần, khi các file liên tục include lẫn nhau. Và điều này gây ra những lỗi biên dịch không mong muốn.

Giải quyết cho vấn đề này, kỹ thuật header guard được sử dụng nhằm mục đích chỉ định nghĩa các hàm một lần duy nhất.

2. Sử Dụng Header Guard trong lập trình c++

Ví dụ thực hiện cho file A như sau:

#ifndef FILE_A_H_
#define FILE_A_H_

int Sum (const int& a, const int& b) {return a + b}

#endif

+ Sử dụng một cặp chỉ thị tiền xử lý để thực hiện header guard như ở trên.

+ Tên của chỉ thị thường đặt theo cú pháp:  Tên File_H_

+ Lần đâu tiên FILE_A_H_ chưa được định nghĩa lên, nó sẽ được định nghĩa và hàm Sum được thực hiện.

+ Lần thứ hai khi được gọi từ include. thì FILE_A_H_ đã được định nghĩa ở lần gọi đầu rồi, nên chị thị tiền xử lý sẽ không nhảy vào trong. Nên Sum không bị định nghĩa lại nữa.

Header Guard là một kỹ thuật cần thiết phải sử dụng mỗi khi khai báo một file header mới.

Ngoài cách trên, thì một số trình biên dịch hiện đại sử dùng #pragma one để thay thế. Tuy nhiên nó không thuộc về kỹ thuật của c++. Do đó, nên khuyên cáo nên sử dụng cách truyền thông như tôi làm ở trên.

Ok. Đó là Header Guard trong c++

Pass Pham

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.