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.
Dùng biến mà declare qua quá nhiều lớp trung gian
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.
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ứ?
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ì:
- File etherdevice.h đã có giới thiệu về BITS_PER_LONG tại đây
- 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ầnBITS_PER_LONG
, thì bạn cứ việc#include <bitsperlong.h>
trong filemain.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.
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
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: