Trong một số môi trường, việc biên dịch sẽ nhanh nhất nếu một môi trường chỉ bao gồm các tệp tiêu đề mà người ta cần. Trong các môi trường khác, quá trình biên dịch sẽ được tối ưu hóa nếu tất cả các tệp nguồn có thể sử dụng cùng một bộ sưu tập tiêu đề chính (một số tệp có thể có các tiêu đề bổ sung ngoài tập hợp con chung). Tốt nhất, tiêu đề nên được tạo để nhiều thao tác #include sẽ không có tác dụng. Có thể tốt nếu bao quanh các câu lệnh #include với các kiểm tra đối với trình bảo vệ của tệp-được-bao gồm, mặc dù điều đó tạo ra sự phụ thuộc vào định dạng của trình bảo vệ đó. Hơn nữa, tùy thuộc vào hành vi lưu vào bộ nhớ đệm tệp của hệ thống, một #include không cần thiết có mục tiêu kết thúc hoàn toàn là # ifdef'ed có thể không mất nhiều thời gian.
Một điều khác cần xem xét là nếu một hàm nhận một con trỏ đến một cấu trúc, người ta có thể viết nguyên mẫu dưới dạng
void foo (struct BAR_s * bar);
mà không có định nghĩa cho BAR_s phải nằm trong phạm vi. Một cách tiếp cận rất tiện dụng để tránh bao gồm không cần thiết.
Tái bút - trong nhiều dự án của tôi, sẽ có một tệp mà người ta mong đợi rằng mọi mô-đun sẽ #include, chứa những thứ như typedef cho kích thước số nguyên và một vài cấu trúc và sự kết hợp phổ biến [ví dụ:
typedef liên minh {
không dấu dài l;
không dấu ngắn lw [2];
không dấu char lb [4];
} U_QUAD;
(Vâng, tôi biết mình sẽ gặp rắc rối nếu chuyển sang kiến trúc big-endian, nhưng vì trình biên dịch của tôi không cho phép các cấu trúc ẩn danh trong các liên minh, nên việc sử dụng các mã nhận dạng được đặt tên cho các byte trong liên hợp sẽ yêu cầu chúng được truy cập như theUnion.b.b1, v.v. có vẻ khá khó chịu.