Tác giả: Nguyễn Phú Hưng
Trong bất kì ngôn ngữ lập trình nào, khi viết một chương trình hay một project đến một độ lớn nào đó, bạn sẽ gặp vấn đề về quản lí source code. Khi đó, sẽ vất vả hơn khi phải mò mẫm giữa hàng trăm hay hàng ngàn dòng code để debug hoặc thay đổi một phần nào đó của chương trình. Với ngôn ngữ C, vấn đề này phần nào được giải quyết bởi kĩ thuật tách hàm, tức là tách chương trình thành nhiều hàm, mà mỗi hàm có một tính năng nhất định. Tuy nhiên, khi chương trình được mở rộng ở quy mô lớn hơn thì ta còn một kĩ thuật khác để quản lí, đó là kĩ thuật tách file.
Để đọc hiểu bài viết này, các bạn chỉ cần nắm vững kiến thức về lập trình C cơ bản, bao gồm:
- Nhập xuất cơ bản qua bàn phím và màn hình
- Sử dụng hàm
Trong bài viết này, mình sử dụng IDE Dev-Cpp 5.11.
Ngoài ra, các bạn có thể sử dụng những IDE khác hỗ trợ lập trình ngôn ngữ C như Visual Studio Code, Netbeans, Code::Block,…
Tại sao phải tách file?
Như đã đề cập ở đầu bài viết, khi viết một chương trình lớn, việc tách chương trình thành nhiều file sẽ giúp cho việc quản lí source code dễ dàng hơn, cũng như để người khác có thể đọc và hiểu code của bạn một cách nhanh chóng.
Hướng dẫn tách file
Để tìm hiểu về tách file, chúng ta sẽ xem xét một ví dụ đơn giản:
Viết một chương trình cho người dùng nhập vào chiều dài và chiều rộng của một hình chữ nhật. In ra màn hình chu vi và diện tích của hình chữ nhật đó.
Đầu tiên, mình tạo project tên là RectangleCalculator, trong đó có file main.c chứa hàm main().
Trong file main.c, mình viết các câu lệnh chính để nhập và xuất các giá trị:
Các bạn có thể thấy trong phần // print output, mình có gọi 2 hàm là calPerimeter() và calArea(). Để phục vụ cho việc tách file, mình sẽ tạo file calculator.h trong cùng project RectangleCalculator và khai báo 2 hàm này:
File calculator.h gọi là file header, chứa khai báo các tên hàm, kiểu dữ liệu trả về và tham số trong hàm. Các khai báo này gọi là prototype. File này không chứa các câu lệnh dùng để thực thi hàm.
Sau khi đã có file header, mình định nghĩa những hàm trong đó bằng file calculator.c:
File calculator.c gọi là file source, chứa định nghĩa của các hàm trong file header. Định nghĩa là phần chứa các câu lệnh dùng để thực thi hàm. Phần #include “calculator.h” được viết ở đầu file này để người đọc có thể dễ dàng truy cập vào file header và xem các khai báo (như xem mục lục).
Đến bước này, mình đã có 3 file là main.c, calculator.h và calculator.c. Chỉ còn một việc cuối cùng là liên kết các file này lại với nhau bằng cách thêm #include “calculator.h” vào file main.c, IDE sẽ tự tìm đến calculator.c thông qua calculator.h.
Khi hoàn thành, trong project sẽ có 3 file:
Chạy chương trình:
Một số lưu ý
Trong file main.c, các bạn có thể thấy mình #include theo 2 cách:
- #include <tên file> : include một file trong thư viện của compiler.
- #include “tên file” : include một file nằm trong project do chính bạn viết.
File header và file source phải cùng tên (chỉ khác đuôi .h và .c). File header có thể hiểu như một cầu nối giữa file main và file .c được trỏ tới. Ta không viết định nghĩa của hàm ngay trong file header vì file header theo quy tắc chỉ chứa khai báo, còn các định nghĩa sẽ được viết trong file source. Không tuân thủ quy tắc này sẽ khiến người khác khó khăn trong việc đọc code và giảm hiệu suất của compiler.
Khi file main.c được tách ra thành 3 file main.c, calculator.h, calculator.c, ta có:
- main.c chứa #include “calculator.h” và những dòng code chính của chương trình.
- calculator.h chứa các khai báo của các hàm (prototype).
- calculator.c chứa #include “calculator.h” và định nghĩa của các hàm.
Hi vọng qua bài viết, các bạn đã trang bị được thêm cho mình một kĩ năng để quản lí source code khi viết chương trình lớn.
Mọi khó khăn hay thắc mắc các bạn có thể comment bên dưới để được giải đáp.
Chúc các bạn thành công!