Hãy nhớ rằng, bộ tiền xử lý C / C ++ là một bước xử lý riêng biệt, hoàn toàn bằng văn bản. Lệnh #include
này kéo theo nội dung của tiêu đề đi kèm và trình biên dịch phải phân tích cú pháp. Hơn nữa, việc biên dịch từng cái .cpp
là hoàn toàn riêng biệt, vì vậy thực tế là trình biên dịch chỉ phân tích cú pháp B.h
khi biên dịch B.cpp
không giúp ích gì cho nó khi nó cần lại khi biên dịch A.cpp
. Và một lần nữa khi biên dịch C.cpp
. Và D.cpp
. Và như thế. Và mỗi tệp đó phải được biên dịch lại nếu có bất kỳ tệp nào trong đó bị thay đổi.
Vì vậy, nói rằng lớp A
sử dụng lớp B
và các lớp C
và D
sử dụng lớp A
, nhưng không cần phải thao tác B
. Nếu lớp A
có thể được khai báo chỉ bằng khai báo chuyển tiếp B
, hơn B.h
được biên dịch hai lần: khi biên dịch B.cpp
và A.cpp
(vì B
vẫn cần thiết trong A
các phương thức của).
Nhưng khi A.h
bao gồm B.h
, nó được biên dịch Bốn lần-khi biên soạn B.cpp
, A.cpp
, C.cpp
và D.cpp
càng về sau hai giờ gián tiếp bao gồm B.h
quá.
Ngoài ra khi tiêu đề được bao gồm nhiều lần, bộ tiền xử lý vẫn phải đọc nó mỗi lần. Nó sẽ bỏ qua việc xử lý nội dung của nó vì các bảo vệ #ifdef
, nhưng nó vẫn đọc nó và cần tìm kiếm phần cuối của bảo vệ, điều đó có nghĩa là nó phải phân tích tất cả các chỉ thị tiền xử lý bên trong.
(Như đã đề cập trong câu trả lời khác, các tiêu đề được biên dịch trước đang cố gắng khắc phục điều này, nhưng chúng là những con giun của riêng chúng; về cơ bản bạn có thể sử dụng chúng một cách hợp lý cho các tiêu đề hệ thống và chỉ khi bạn không sử dụng quá nhiều chúng, nhưng không phải cho tiêu đề trong dự án của bạn)
vehicle.h
,bus.h
,toybus.h
.vehicle.h
bao gồm bởibus.h
vàbus.h
bao gồm bởitoybus.h
. Vì vậy, nếu tôi làm một số thay đổi trongbus.h
. trình biên dịch mở và phân tíchvehicle.h
lại? nó biên dịch lại lần nữa?