Tệp mã nguồn
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 3 trên 61.
Cho đến nay, chúng ta đã đặt các khai báo hàm trong tệp header, nhưng phần code hàm thực tế (định nghĩa) vẫn nằm trong tệp chính. Bước tiếp theo trong lập trình mô-đun là chuyển các định nghĩa đó vào tệp mã nguồn (tệp .c).
Cách này tạo ra cấu trúc gọn gàng gồm ba phần: tệp header khai báo các hàm, một tệp mã nguồn riêng định nghĩa chúng, còn main chỉ cần sử dụng chúng. Cấu trúc này trông như sau:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
Lưu ý rằng math_utils.c có đưa tệp tiêu đề của chính nó vào. Điều này đảm bảo phần định nghĩa hàm khớp với phần khai báo. Nếu hai phần không khớp, trình biên dịch sẽ phát hiện lỗi. Tệp chính chỉ cần đưa tệp tiêu đề vào để sử dụng hàm, không cần biết add hoạt động bên trong như thế nào.
Cách tách riêng này giúp ẩn các chi tiết triển khai và cho phép bạn thay đổi logic của hàm mà không cần chỉnh sửa các tệp sử dụng những hàm đó.
Thử thách
DễHãy xây dựng một tiện ích toán học đơn giản bằng cách sắp xếp code theo cấu trúc ba tệp phù hợp: một tệp header để khai báo, một tệp nguồn để định nghĩa và một tệp main để sử dụng chúng.
Bạn sẽ tạo ba tệp:
math_ops.h: Tệp header chứa các khai báo hàm cho hai phép toán:multiplyvàsubtract. Cả hai hàm nhận hai số nguyên và trả về một số nguyên. Đừng quên thêm các chỉ thị bảo vệ header bằng ký hiệuMATH_OPS_H.math_ops.c: Tệp nguồn chứa phần định nghĩa thực tế củamultiplyvàsubtract. Tệp này cần include header của chính nó để bảo đảm các khai báo khớp với phần định nghĩa.main.c: Tệp main include header và sử dụng cả hai hàm để thực hiện phép tính.
Hàm multiply cần trả về tích của hai số nguyên, còn subtract cần trả về hiệu của số nguyên thứ nhất trừ số nguyên thứ hai.
Bạn sẽ nhận hai đầu vào kiểu số nguyên: a và b.
Trong hàm main, hãy in kết quả của cả hai phép toán trên các dòng riêng:
Product: {result of multiply}
Difference: {result of subtract}Ví dụ, với đầu vào là 8 và 3, đầu ra sẽ là:
Product: 24
Difference: 5Tự làm thử
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: Gọi hàm (function) multiply với a và b, lưu kết quả
// TODO: Gọi hàm subtract với a và b, lưu kết quả
// TODO: In kết quả theo định dạng:
// Product: {kết quả của multiply}
// Difference: {kết quả của subtract}
return 0;
}
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
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online