Tại sao chúng ta cần phải viết một tệp tiêu đề?


12

Trước khi bạn xóa những bình luận lén lút của mình, tôi biết - đây là một câu hỏi không hay. Đây là lần đầu tiên tôi sử dụng ngôn ngữ dựa trên C.

Tôi là sinh viên đại học đang học Mục tiêu C cho một khóa học về khoa học máy tính về phát triển di động. Tôi biết rằng, trong môi trường học thuật, rất nhiều cân nhắc trong thế giới thực không cần thiết vì bạn đang xây dựng các dự án nhỏ hơn, làm việc trong các nhóm nhỏ hơn, v.v.

Nhưng giáo sư của chúng tôi yêu cầu - và XCode hỗ trợ - các tệp tiêu đề .h cho mọi tệp triển khai .m. Đối với tôi, nó có vẻ như là công việc bận rộn. Tôi phải đảm bảo rằng tôi sao chép mọi chữ ký phương thức và biến đối tượng sang tệp khác. Nếu tôi thay đổi một tệp, tôi phải đảm bảo rằng nó phù hợp với tệp khác. Có vẻ như chỉ là một loạt những phiền toái nhỏ như thế.

Nhưng tôi biết rằng phải có một số sử dụng trong thế giới thực cho các tệp tiêu đề. Một câu trả lời tuyệt vời sẽ giải quyết cả hai:

  1. Tệp tiêu đề hữu ích cho việc tệp triển khai không phù hợp là gì? Mục đích của nó là gì?
  2. Tại sao chúng ta là lập trình viên phải tự viết các tệp tiêu đề? Có vẻ như chúng có thể dễ dàng được tạo ra tự động.

Cảm ơn trước!


XCode có hỗ trợ tái cấu trúc tự động để nếu bạn thay đổi chữ ký trong tiêu đề, nó sẽ tự động được truyền tới việc thực hiện (và ngược lại)? Hoặc có thể có một plugin hỗ trợ điều đó? Tôi biết đó là một nỗi đau để làm bằng tay.
Thất vọngWithFormsDesigner

Phản ứng đầu tiên của tôi khi tôi biết về các tệp tiêu đề là "phải có cách tự động làm điều đó". Tôi đã khá bối rối khi tôi cố gắng tìm kiếm một công cụ hỗ trợ điều đó và không tìm thấy bất kỳ sự lựa chọn rõ ràng, tuyệt vời nào.
Hartley Brody

Tôi ngạc nhiên khi chức năng như vậy không tồn tại. Tôi biết Eclipse có thể thực hiện tái cấu trúc như vậy cho Java, tôi không biết các plugin C / C ++ có thể thực hiện tái cấu trúc tiêu đề / impl hay không. Tôi đoán nếu không có công cụ như vậy tồn tại cho XCode, nó có thể là thứ đáng để phát triển. ;)
Thất vọngWithFormsDesigner

Câu trả lời:


9
  1. Nói ngắn gọn;

    • Tệp tiêu đề xác định API cho một mô-đun. Đó là một danh sách hợp đồng mà phương thức mà bên thứ ba có thể gọi. Các mô-đun có thể được coi là một hộp đen cho các bên thứ ba.

    • Việc thực hiện các mô-đun. Nó là bên trong của hộp đen. Là nhà phát triển mô-đun, bạn phải viết phần này, nhưng là người dùng mô-đun bên thứ ba, bạn không cần biết gì về việc triển khai. Tiêu đề nên chứa tất cả thông tin bạn cần.

  2. Một số phần của tệp tiêu đề có thể được tạo tự động - khai báo phương thức. Điều này sẽ yêu cầu bạn chú thích việc triển khai vì có thể có các phương thức riêng tư trong quá trình triển khai không phải là một phần của API và không thuộc về tiêu đề.

Các tệp tiêu đề đôi khi có thông tin khác trong đó; định nghĩa kiểu, định nghĩa không đổi, v.v ... Chúng thuộc về tệp tiêu đề và không có trong triển khai.


Nhưng khi nào thì ai đó sẽ ở trong tình huống họ cần sử dụng mã của tôi, nhưng chỉ có quyền truy cập vào tệp .h? Họ vẫn không cần .m để chạy nó chứ?
Hartley Brody

1
Tôi hiểu sự cần thiết phải trừu tượng ở mức độ lý thuyết, trong trường hợp bạn thay đổi chi tiết thực hiện, nhưng tôi không chắc chắn khi nào một tình huống như thế này sẽ xảy ra.
Hartley Brody

10
Đôi khi, thông thường vì lý do thương mại, bạn có thể muốn cho phép ai đó sử dụng mã của mình, nhưng không có quyền truy cập vào việc triển khai của bạn. Trong trường hợp này, bạn sẽ cung cấp một tệp tiêu đề và mã thư viện hoặc mã đối tượng đã được biên dịch.
Luke Graham

À, tôi hiểu rồi. Không được coi là mã sẽ được biên dịch, do đó có thể sử dụng được nhưng không thể đọc được. Cảm ơn!
Hartley Brody

3
Ngoài ra, tại sao tôi muốn đọc phần triển khai để biết cách sử dụng mã của bạn? Nó là đủ để đọc các tập tin tiêu đề.
Per Johansson

5

Lý do chính cho một tiêu đề là để có thể #includenó trong một số tệp khác, vì vậy bạn có thể sử dụng các chức năng trong một tệp từ tệp khác đó. Tiêu đề bao gồm (chỉ) đủ để có thể sử dụng các chức năng, chứ không phải chính các chức năng, vì vậy (chúng tôi hy vọng) biên dịch nó nhanh hơn đáng kể.

Duy trì hai kết quả riêng biệt từ hầu hết mọi người đã từng viết một trình soạn thảo tự động hóa quá trình rất tốt. Thực sự không có nhiều lý do họ không thể làm như vậy, và một số thậm chí đã cố gắng - nhưng các biên tập viên đã làm như vậy chưa bao giờ làm rất tốt trên thị trường, và các biên tập viên chính thống hơn đã không chấp nhận nó.


2

Bao gồm một tiêu đề cho phép mã của bạn gọi các hàm hoặc phương thức được viết ở nơi khác và có thể hoặc không phải là một phần của dự án / bản dựng phần mềm của bạn, nhưng có thể được tìm thấy bởi 'trình liên kết' khi bạn đang xây dựng phần mềm.

Chẳng hạn, khi bạn gọi một hàm trong thư viện C tiêu chuẩn thì bạn không muốn phải đặt tất cả các phần bên trong của hàm đó trong dự án của mình - bạn chỉ cần mong đợi chương trình của mình có thể gọi nó.

Nhưng trình biên dịch của bạn cần được thông báo rằng hàm tồn tại ở đâu đó ngay cả khi nó không thể nhìn thấy mã và tiêu đề thực hiện điều đó. Khi trình biên dịch kết thúc, trình liên kết được gọi và nó trông giống như 'liên kết' các bit của mã của bạn bị treo lủng lẳng, chẳng hạn như các cuộc gọi thư viện.


1

Các tệp tiêu đề chủ yếu được sử dụng để khai báo và bao gồm các chữ ký (nghĩa là tên hàm, giá trị trả về và đối số) của các hàm của bạn trong các tệp khác. Trình biên dịch cần biết các chữ ký này khi biên dịch và liên kết các tệp của bạn với nhau.

Đọc này bài viết để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.