Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cách tự viết file header (.h) trong C

File header (tệp tiêu đề) trong C cho phép tách khai báo (prototype) hàm, hằng số, cấu trúc dữ liệu ra khỏi file nguồn chính, giúp mã nguồn mô-đun, dễ tái sử dụng và bảo trì.

Quy tắc tạo file header

  • Đuôi mở rộng là .h (ví dụ: my_math.h).
  • Chỉ chứa khai báo: prototype hàm, macro, hằng số, struct, typedef, biến extern.
  • Không chứa định nghĩa hàm (function body) hay biến toàn cục (trừ static hoặc inline).
  • Sử dụng include guard để tránh include trùng lặp.

Cú pháp Include Guard

#ifndef MY_MATH_H
#define MY_MATH_H

// Khai báo ở đây

#endif // MY_MATH_H

Ví dụ hoàn chỉnh

1. File header: my_math.h

#ifndef MY_MATH_H
#define MY_MATH_H

// Hằng số
#define PI 3.14159265358979323846

// Prototype hàm
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
double circle_area(double radius);

#endif

2. File triển khai: my_math.c

#include "my_math.h"

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return b != 0 ? a / b : 0; }
double circle_area(double r) { return PI * r * r; }

3. File chính: main.c

#include <stdio.h>
#include "my_math.h" // Dùng dấu ngoặc kép cho header tự viết

int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    printf("10 - 4 = %d\n", sub(10, 4));
    printf("6 * 7 = %d\n", mul(6, 7));
    printf("20 / 4 = %d\n", div(20, 4));
    printf("Dien tich hinh tron (r=5): %.2f\n", circle_area(5.0));
    return 0;
}

Biên dịch và chạy

gcc main.c my_math.c -o app
./app

Kết quả

5 + 3 = 8
10 - 4 = 6
6 * 7 = 42
20 / 4 = 5
Dien tich hinh tron (r=5): 78.54

Lưu ý quan trọng

  • File .h và .c nên đặt cùng thư mục hoặc cấu hình đường dẫn include (-I).
  • Không bao giờ #include "file.c" — chỉ include file .h.
  • Tránh đặt định nghĩa biến toàn cục trong header (gây lỗi multiple definition khi link).

Việc tách header giúp quản lý dự án lớn tốt hơn, cho phép nhiều file .c chia sẻ cùng một interface mà không cần biết chi tiết triển khai.