Menu
CoddyTech

Hàm static

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 4 trên 61.

Khi chia code thành nhiều tệp, theo mặc định, mọi hàm được định nghĩa trong một tệp mã nguồn đều hiển thị với các tệp khác. Nhưng đôi khi bạn cần những hàm trợ giúp chỉ dùng nội bộ, tức là các hàm mà những tệp khác không nên truy cập hoặc thậm chí biết đến.

Từ khóa static, khi áp dụng cho một hàm, giới hạn khả năng hiển thị của hàm trong tệp nơi hàm được định nghĩa. Điều này tạo ra một hàm private mà các tệp mã nguồn khác không thể gọi, ngay cả khi có người cố khai báo hàm đó.

// math_utils.c
#include "math_utils.h"

// Hàm hỗ trợ riêng (function), chỉ dùng trong tệp này
static int square(int x) {
    return x * x;
}

// Hàm công khai, có thể gọi từ main.c
int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

Trong ví dụ này, sum_of_squares được khai báo trong tệp tiêu đề và có thể dùng ở bất cứ đâu. Tuy nhiên, square được đánh dấu là static, nên chỉ tồn tại trong math_utils.c. Nếu main.c cố gọi trực tiếp square(), trình liên kết sẽ báo lỗi: hàm này đơn giản là không tồn tại bên ngoài tệp của nó.

Đây là cách C thực hiện tính đóng gói ở cấp độ tệp. Các hàm static giúp bạn ẩn chi tiết triển khai, giữ cho giao diện công khai gọn gàng, đồng thời cho phép bạn dùng mọi logic hỗ trợ cần thiết bên trong.

challenge icon

Thử thách

Dễ

Hãy xây dựng một chương trình tính khoảng cách, sử dụng một hàm trợ giúp riêng để tính bình phương của một số: đây là chi tiết cần được ẩn khỏi phần còn lại của chương trình.

Bạn sẽ tạo ba tệp:

  • distance.h: Tệp tiêu đề khai báo một hàm công khai duy nhất là distance_squared. Hàm này nhận bốn số nguyên (x1, y1, x2, y2) biểu thị hai điểm và trả về một số nguyên. Thêm các chỉ thị bảo vệ tệp tiêu đề bằng ký hiệu DISTANCE_H.
  • distance.c: Tệp mã nguồn chứa phần triển khai. Tạo một hàm trợ giúp static có tên square, nhận một số nguyên và trả về bình phương của số đó. Chỉ có thể gọi hàm trợ giúp này bên trong distance.c. Sau đó, triển khai distance_squared bằng cách dùng hàm trợ giúp static để tính (x2-x1)² + (y2-y1)².
  • main.c: Tệp chính, có khai báo tệp tiêu đề và dùng hàm công khai. Không thể truy cập hàm trợ giúp square tại đây, chỉ có thể dùng distance_squared.

Hàm distance_squared tính bình phương khoảng cách Euclid giữa hai điểm. Khi khai báo hàm square là static, bạn ẩn chi tiết triển khai này khỏi mọi code bên ngoài distance.c.

Bạn sẽ nhận bốn đầu vào là số nguyên: x1, y1, x2 và y2.

In bình phương khoảng cách theo định dạng sau:

Squared distance: {result}

Ví dụ, với hai điểm (0, 0) và (3, 4), đầu ra sẽ là:

Squared distance: 25

Tự làm thử

#include <stdio.h>
#include "distance.h"

int main() {
    int x1, y1, x2, y2;
    scanf("%d", &x1);
    scanf("%d", &y1);
    scanf("%d", &x2);
    scanf("%d", &y2);
    
    // TODO: Gọi hàm (function) distance_squared với các tọa độ đầu vào
    // và in kết quả theo định dạng: "Squared distance: {result}"
    
    return 0;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online