Nếu có một tiêu đề cụ thể mà bạn cho rằng không cần thiết nữa (ví dụ string.h), bạn có thể nhận xét rằng bao gồm sau đó đặt điều này bên dưới tất cả các bao gồm:
#ifdef _STRING_H_
# error string.h is included indirectly
#endif
Tất nhiên, các tiêu đề giao diện của bạn có thể sử dụng quy ước #define khác để ghi lại việc đưa chúng vào bộ nhớ CPP. Hoặc không có quy ước, trong trường hợp đó, cách tiếp cận này sẽ không hoạt động.
Sau đó xây dựng lại. Có ba khả năng:
Nó xây dựng ok. string.h không phải là biên dịch quan trọng và có thể xóa phần bao gồm cho nó.
Các chuyến đi #error. string.g đã được đưa vào một cách gián tiếp bằng cách nào đó Bạn vẫn không biết liệu string.h có được yêu cầu hay không. Nếu nó được yêu cầu, bạn nên trực tiếp #include nó (xem bên dưới).
Bạn gặp một số lỗi biên dịch khác. string.h là cần thiết và không được bao gồm một cách gián tiếp, vì vậy, bắt đầu bao gồm là chính xác.
Lưu ý rằng tùy thuộc vào việc đưa vào gián tiếp khi .h hoặc .c của bạn trực tiếp sử dụng .h khác gần như chắc chắn là một lỗi: bạn đang hứa rằng mã của bạn sẽ chỉ yêu cầu tiêu đề đó miễn là một số tiêu đề khác mà bạn đang sử dụng yêu cầu, mà có lẽ không phải như ý bạn.
Cảnh báo được đề cập trong các câu trả lời khác về tiêu đề sửa đổi hành vi thay vì khai báo những thứ gây ra lỗi xây dựng cũng áp dụng ở đây.