Một khó khăn với loại trừ tiêu đề trùng lặp tự động là tiêu chuẩn C tương đối im lặng về chủ đề bao gồm tên tệp có nghĩa là gì. Ví dụ: giả sử tệp chính đang được biên dịch chứa các lệnh #include "f1.h"
và #include "f2.h"
và các tệp được tìm thấy cho các lệnh đó đều chứa #include "f3.h"
. Nếu f1.h
và f2.h
nằm trong các thư mục khác nhau, nhưng được tìm thấy bằng cách tìm kiếm bao gồm các đường dẫn, thì sẽ không rõ các #include
chỉ thị trong các tệp đó được dự định tải cùng một f3.h
tệp hoặc các tệp khác nhau.
Mọi thứ thậm chí còn tồi tệ hơn nếu người ta thêm vào các khả năng bao gồm các tệp bao gồm các đường dẫn tương đối. Trong một số trường hợp trong đó các tệp tiêu đề sử dụng các đường dẫn tương đối cho các lệnh được lồng vào nhau và trong đó người ta muốn tránh thực hiện bất kỳ thay đổi nào đối với các tệp tiêu đề được cung cấp, có thể cần phải có một tệp tiêu đề được sao chép ở nhiều vị trí trong cấu trúc thư mục của dự án. Mặc dù có nhiều bản sao vật lý của tệp tiêu đề đó tồn tại, chúng vẫn nên được xem xét về mặt ngữ nghĩa như thể chúng là một tệp duy nhất.
Nếu lệnh #pragma once
cho phép một mã định danh tuân theo once
, với ngữ nghĩa mà trình biên dịch sẽ bỏ qua tệp nếu mã định danh khớp với một từ một lệnh được gặp trước đó #pragma once
, thì ngữ nghĩa sẽ không rõ ràng; một trình biên dịch có thể cho biết rằng một lệnh #include
sẽ tải cùng một #pragma once
tệp được đánh dấu như trước đó, nó có thể tiết kiệm một chút thời gian bằng cách bỏ qua tệp mà không mở lại, nhưng phát hiện như vậy sẽ không quan trọng về mặt ngữ nghĩa vì tệp có bị bỏ qua hay không hoặc không phải tên tệp được công nhận là khớp. Tôi không biết về bất kỳ trình biên dịch làm việc theo cách đó, tuy nhiên. Có một trình biên dịch quan sát xem một tệp có khớp với mẫu đó #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
hay không và xử lý một thứ tương đương như trên #pragma once someIdentifier
nếusomeIdentifier
vẫn được xác định, về cơ bản là tốt.
#pragma once
trình biên dịch chỉ bao gồm tệp đó một lần.