Tại sao lại không viết phần định nghĩa vào file .h?

Anh ơi cho em hỏi. Tại sao không viết phần định nghĩa ở file.h mà phải chuyển sang viết ở file.cpp

1 Like

đó là tùy vào cách viết của mỗi người, để có dễ nhìn.
Mà theo mình biết thì viết riêng ra để khi lúc mình đưa tên thư viện vào 1 cái hàm main, thì chỉ đưa file .h vào thôi, chứ ko đem nguyên cái file .cpp vào main(), làm giảm bộ nhớ khi gọi thư viện. nó sẽ dựa vào cái thư viện mà tìm ra các hàm trong file .cpp chứ ko phải tải hết file .cpp vào main().
em nói vậy đúng ko a @ltd

3 Likes

Trước khi vào quán ăn người ta nhìn cái biển hiệu quảng cáo trước.
Trước khi sử dụng thư viện người ta coi danh sách function trước.

1 Like

Có nhiều lý do khi người ta phân ra khai báo trong file .h và định nghĩa hàm trong file .cpp

  1. Giúp code rõ ràng hơn.
    Khi khai báo và định nghĩa trong cùng file .h thì file sẽ rất nhiều code, đảm bảo bạn nhìn vào thì cũng mất thời gian mới hiểu file đó nó nói về cái gì.

  2. Giúp người khác dễ hiểu khi đọc code.
    Người sử dụng code của bạn không quan tâm bạn định nghĩa gì ở trong hàm của bạn, người ta chỉ quan tâm code của bạn có thể làm gì và sử dụng nó như thế nào nên người ta chỉ cần nhìn vào phần khai báo là đủ. Việc định nghĩa chung với khai báo là không cần thiết.

  3. Che giấu định nghĩa code của bạn
    Khi viết một thư viện, không phải lúc nào bạn cũng sẵn sàng chia sẻ source code cho mọi người. Ví dụ như trong trường hợp viết một thư viện rồi mình bán chẳng hạn. Bạn chỉ muốn người sử dụng những API nào bạn cung cấp. Khi đó bạn chỉ việc cung cấp file dll, hoặc file lib build sẵn kèm theo các file header. Như vậy họ chỉ biết sử dụng chứ không biết bạn thực sự làm gì bên dưới.

Một số lý do liên quan tới quá trình compile thì mình chưa rõ lắm

3 Likes

Trước nghe cô giáo nói, sở dĩ ko viết định nghĩa các hàm là do nếu viết chung thì lúc biên dịch nó sẽ chậm. Nhớ ko lầm là vậy. Bên cạnh đó nên viết thêm mấy thủ tục trước và sau class trong file .h để khi biên dịch nó sẽ bỏ qua nếu như class đó ko có định nghĩa mới => nhanh hơn.

Nếu viết định nghĩa vào trong file .h thì khi compile bất cứ file .cpp nào có include file .h đó, cái file .cpp phải compile lại nội dung của file .h. Nếu có n lần include file .h có định nghĩa code, ta sẽ phải compile lại n lần file .h

Nguyên tắc của #include tức là mang toàn bộ code của file được include vào file hiện tại. Nếu mình để chỉ khai báo hàm, tức viết prototype, thì đây là cách báo cho file .cpp hiện tại biết rằng sẽ có định nghĩa của hàm ở một object khác.

Việc làm này sẽ giúp cho việc thiết kế thư viện tách biệt với việc xây dựng chương trình. File .h là mục lục để chỉ cho chương trình biết cú pháp của hàm là như thế nào. Còn việc liên kết với thư viện sẽ được linker thực hiện sau khi compile xong.

6 Likes

Nếu ko cần hiểu rõ như anh nói thì ngắn gọn là: làm vậy để khi biên dịch nó nhanh hơn.

Khi đọc code chỉ cần đọc phần header là hiểu tác dụng của hàm

Trích tài liệu : Tài liệu lập trình C for newbie - Chương 2: Những kỹ thuật nâng cao!

#Vậy lợi ích của việc đặt các prototypes vào file .h là gì ?

Lí do cũng khá đơn giản.Khi code source bạn viết yêu cầu gọi một function, máy tính của bạn bắt buộc phải biết trước function đó là gì, nó cần bao nhiêu tham số (parameter),… Vì thế ta cần đến prototype: giống như một bảng hướng dẫn sử dụng trước khi dùng function cho máy tính.

Câu hỏi trên tương ứng với câu hỏi về thứ tự chạy chương trình: nếu bạn đặt các prototypes trong những file .h (headers) #include ở phần đầu những file .c , máy tính của bạn sẽ hiểu được cách sử dụng tất cả các function kể từ giai đoạn bắt đầu chạy chương trình. Và điều đó giúp bạn ít bận tâm hơn về thứ tự đặt các function trong các files .c.

Hiện giờ, bạn chỉ viết một số chương trình chứa khoảng hai hoặc ba functions, bạn vẫn chưa thấy rõ ích lợi của những prototypes nhưng về sau, khi bạn đã có thể viết nhiều functions hơn rồi, nếu bạn không đặt các prototypes trong những file .h, bạn sẽ thường xuyên gặp lỗi trong việc dịch chương trình.

2 Likes

Khi bạn học đến template thì cuối cùng cũng phải bắt buộc nhét code vào file .h :joy:. Mình chả thích cái này của C, C++ lắm, mất công copy qua copy lại rồi file .cpp thành một mớ hầm bà lằng.
Do đó mấy ngôn ngữ mới thường không tách biệt 2 cái khai báo và cài đặt.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?