Dùng biến mà declare qua quá nhiều lớp trung gian

Mình đọc các file code để có thực tế. Mình gặp trường hợp như thế này:
Biến Var được định nghĩa ở file A.h.
File B.h include file A.h
File C.h include file B.h
File prog.c include file C.h và sử dụng biến Var.
Nếu mình là người viết file prog.c thì làm sao có thể biết, hiểu và áp dụng biến Var vào chương trình của mình, nó lòng vòng quá.
Mình còn ở mức beginner, nên nghĩ là chỉ cần hiểu file C.h rồi áp dụng vào chương trình.

Nó lòng vòng là do bạn đã làm sai nguyên tắc ở đây rồi.
Khi bạn #include <c.h> thì bạn chỉ có thể sử dụng những gì file c.h cung cấp/public cho bạn.
Còn nếu bạn muốn dùng biến Var của file a.h thì bạn phải nên #include <a.h> trong file prog.c của bạn.

Dĩ nhiên là bạn có thể #include <a.h> trong c.h, và dùng Var khi chỉ #include <c.h>, nhưng rồi 1 ngày đẹp trời nào đó, c.h không thích #include <a.h> nữa thì coi như tạch.

2 Likes

Không, cái kiểu này là hoàn toàn đúng, mình đọc nó trong một file driver của nhân Linux.
Nhưng không hiểu nếu mình là người viết driver, mình phải tìm hiểu sâu qua mấy lớp trung gian vậy sao ?

Hình như là bạn chưa đọc kỹ câu cuối cùng trong comment bên trên của mình rồi.

Còn cái này, bạn có thể đưa ra ví dụ cụ thể, file nào dùng tới biến nào, và nó được khai bảo trong file .h nào để cùng phân tích được chứ?

3 Likes

OK bạn đúng. Đây là trường hợp của mình:
Link này là quyên cái folder chứa driver của con usb wifi trong đó có file main.c ,
file main.c: #include <linux/etherdevice.h>
file etherdevice.h: #include <asm/bitsperlong.h>
Có cái macro BITS_PER_LONG define trong file bitsperlong.h
macro này dùng trong file main.c ở đây
Để viết được driver phải hiểu file etherdevice.h, hiểu luôn những file mà file etherdevice.h #include tiếp, có cần thiết không?

ý mình có cần thiết phải hiểu cả hệ thống, thay vì chỉ cần hiểu cái dịch vụ là file etherdevice.h cung cấp

Ở đây, bạn vẫn chỉ cần hiểu file etherdevice.h là đủ, bởi vì:

  1. File etherdevice.h đã có giới thiệu về BITS_PER_LONG tại đây
  2. Trong file main.c người ta dùng BITS_PER_LONG mà không #include <bitsperlong.h> là do người ta hiểu rõ hệ thống.
    Nếu là bạn, khi bạn cần BITS_PER_LONG, thì bạn cứ việc #include <bitsperlong.h> trong file main.c là được, chẳng có ai bắt buộc bạn không được làm vậy cả. Và như mình nói, mình sẽ vẫn ưu tiên làm như vầy hơn.
3 Likes

Cho nên mới có cái gọi là documentation cho những cái như vậy.
Em thử tìm tài liệu cho những cái đó xem.

Băng khoăng của em thì có thể đọc cuống physiology software design. Không phải mọi thứ trong lib java hay c++ điều tốt đâu.


Có điều kiện thì đặt trên fado về đọc. không down pdf cũng được. A đánh giá cuốn này cao hơn cuốn lean code :neutral_face:

5 Likes

Dùng VS code và Search BITS_PER_LONG in All Files.

Tại sao người ta lại làm vậy?
Có một số nguyên nhân sau:

  • Tôi thích vậy, tôi thấy nó tiện

  • Một ví dụ hơi khập khiễng như sau: main.c include platform.h , platform.h có thể include arm.h hoặc include linux.h hoặc include windows.h . Khi cần port qua platform khác thì chỉ cần sửa file platform.h thay vì sửa file main.c. Thứ include trong platform.h là 1 common interface để giao tiếp USB. Như vậy main.c không cần quan tâm đang chạy ở môi trường nào.

  • Một ví dụ khác:

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