Theo hiểu biết của tôi (giới hạn - tôi không phải là nhà phát triển C thông thường), điều này bắt nguồn từ C. Hãy nhớ rằng C không biết các lớp hoặc không gian tên là gì, nó chỉ là một chương trình dài. Ngoài ra, các chức năng phải được khai báo trước khi bạn sử dụng chúng.
Ví dụ, sau đây sẽ cung cấp một lỗi biên dịch:
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Lỗi phải là "Một số chức năng khác không được khai báo" bởi vì bạn gọi nó trước khi khai báo. Một cách để khắc phục điều này là bằng cách di chuyển một số chức năng khác lên trên một số chức năng. Một cách tiếp cận khác là khai báo chữ ký hàm trước:
void SomeOtherFunction();
void SomeFunction() {
SomeOtherFunction();
}
void SomeOtherFunction() {
printf("What?");
}
Điều này cho phép trình biên dịch biết: Nhìn vào đâu đó trong mã, có một hàm gọi là someOtherFunction trả về void và không lấy bất kỳ tham số nào. Vì vậy, nếu bạn mã hóa mã cố gắng gọi cho một số chức năng khác, đừng hoảng sợ và thay vào đó hãy tìm kiếm nó.
Bây giờ, hãy tưởng tượng bạn có một số Hàm và Một số Hàm trong hai tệp .c khác nhau. Sau đó, bạn phải #include "someOther.c" trong some.c. Bây giờ, thêm một số chức năng "riêng tư" vào someOther.c. Vì C không biết các hàm riêng tư, nên hàm đó cũng sẽ có sẵn trong some.c.
Đây là nơi tệp .h xuất hiện: Chúng chỉ định tất cả các hàm (và biến) mà bạn muốn 'Xuất' từ tệp .c có thể được truy cập trong các tệp .c khác. Bằng cách đó, bạn có được một cái gì đó như phạm vi Công cộng / Riêng tư. Ngoài ra, bạn có thể cung cấp tệp .h này cho người khác mà không phải chia sẻ mã nguồn của mình - các tệp .h cũng hoạt động chống lại các tệp .lib đã biên dịch.
Vì vậy, lý do chính thực sự là để thuận tiện, để bảo vệ mã nguồn và để có một chút tách rời giữa các phần của ứng dụng của bạn.
Đó là C mặc dù. C ++ đã giới thiệu Các lớp và các bộ sửa đổi riêng / công khai, vì vậy trong khi bạn vẫn có thể hỏi xem chúng có cần thiết hay không, C ++ AFAIK vẫn yêu cầu khai báo các hàm trước khi sử dụng chúng. Ngoài ra, nhiều Nhà phát triển C ++ cũng đã hoặc đang phát triển C và tiếp quản các khái niệm và thói quen của họ cho C ++ - tại sao thay đổi những gì không bị phá vỡ?