2009-12-23 36 views
8

Với cây thư mục này:Khi bao gồm các tệp tiêu đề, trường hợp đường dẫn có nhạy cảm không?

src/MyLibrary/MyHeader.h 
src/file.cpp 

file.cpp: 

#include "mylibrary/myheader.h" 
... 

Biên soạn file.cpp làm việc với VS, thất bại trong gcc.

  • Tiêu chuẩn nói gì?
  • Nếu đường dẫn phân biệt chữ hoa chữ thường, tại sao điều này lại khôn ngoan?
  • Thực hành tốt nhất là gì, giữ cho tất cả tên tệp/thư mục thường và do đó làm giống nhau khi bao gồm?

Cảm ơn.

Trả lời

21

Độ nhạy trường hợp phụ thuộc vào Hệ điều hành. Windows không phân biệt chữ hoa chữ thường. Linux là.

EDIT:

Trên thực tế, theo quan sát của Martin York 's nhận xét, độ nhạy trường hợp phụ thuộc vào hệ thống tập tin. Theo mặc định, Windows sử dụng hệ thống tệp phân biệt chữ hoa chữ thường, trong khi Linux sử dụng một trường hợp nhạy cảm. Đối với bất kỳ ai quan tâm để biết hệ thống tệp nào phân biệt chữ hoa chữ thường và không có, có danh sách toàn diện trên Wikipedia: Comparison of file name limitations.

+0

Thực ra nó liên quan nhiều hơn đến hệ thống tập tin được sử dụng thay vì hệ điều hành. Mặc định được định nghĩa như trên. Nhưng trên Linux có một hệ thống tập tin lớn hơn để lựa chọn từ một số trong đó không phải là trường hợp nhạy cảm. –

+0

@Martin: Vâng, bạn đã đúng. Cảm ơn bạn đã quan sát chính xác. –

+1

Vì vậy, độ nhạy trường hợp không được chỉ định bởi C89/99/++ 11? hoặc tiêu chuẩn nói rằng đường dẫn tìm kiếm và tên tệp có phân biệt chữ hoa chữ thường không? –

0

Không phải tiêu chuẩn C++ của nó, đó là cách Linux, nơi tất cả các tên đường dẫn phân biệt chữ hoa chữ thường. Cách tốt nhất là chọn bất kỳ tên tệp nào bạn muốn (chủ yếu là chữ thường) và sử dụng cùng một trường hợp trong chỉ thị bao gồm. Cũng luôn sử dụng đường dẫn tệp tương đối.

+0

Tôi sợ, bạn đã sai. Nó ** là ** C++ Standard kiểm soát điều này, và cho phép thực hiện bất kỳ để thực hiện tìm kiếm khi nó thấy phù hợp. – IInspectable

1

Một điểm khác cần nhớ là ký tự dấu tách đường dẫn . Mặc dù Visual Studio (và các IDE Windows khác mà tôi chắc chắn) sẽ chấp nhận hoặc là '/' hoặc '\', bạn nên luôn sử dụng '/' trong một đường dẫn bao gồm cho tính di động.

+2

Để có tính di động tốt hơn, chẳng hạn như các tệp nguồn chuyển động, đường dẫn không được ở trong mã nguồn nhưng được cung cấp cho trình biên dịch. Nếu các tệp tiêu đề di chuyển, thì tất cả mã tham chiếu chúng theo đường dẫn phải được thay đổi và kiểm tra hồi quy! –

+0

@ThomasMatthews Tôi chưa bao giờ nghĩ đến điều đó. Làm thế nào bạn sẽ bao gồm các tiêu đề của bạn mà không sử dụng các thư mục con tương ứng của họ sau đó? – NicoBerrogorry

1

Tiêu chuẩn nói gì?

Chỉ thị trường hợp trong việc thực hiện (trình biên dịch/tiền xử lý). Này được giải thích dưới 16.2.2 [cpp.include]:

Một chỉ thị tiền xử lý của mẫu
# include < h-char-sequence> new-line
tìm kiếm một chuỗi các nơi thực hiện xác định cho một tiêu đề xác định duy nhất bởi trình tự quy định giữa các <> dấu phân cách và gây ra việc thay thế chỉ thị đó bằng toàn bộ nội dung của tiêu đề. Cách xác định các địa điểm hoặc tiêu đề được xác định là được triển khai.

Tương tự, 16.2.3 [cpp.include]:

Một chỉ thị tiền xử lý của mẫu
# include " q-char-sequence" new-line
gây ra thay thế chỉ thị rằng toàn bộ nội dung của tập tin nguồn được xác định theo trình tự được chỉ định giữa các dấu phân cách ".Tệp nguồn được đặt tên được tìm kiếm theo cách được triển khai. Nếu tìm kiếm này không được hỗ trợ hoặc nếu tìm kiếm không thành công, chỉ thị sẽ được xử lý lại như thể đọc
# include < h-char-sequence> new-line
với trình tự giống hệt nhau (bao gồm > ký tự, nếu có) từ chỉ thị gốc.

Lựa chọn tự nhiên cho việc triển khai ngôn ngữ là sử dụng độ nhạy của hệ thống tệp hoặc OS, nhưng không có yêu cầu nghiêm ngặt (như tất cả các câu trả lời khác được đề xuất).

Cách tốt nhất là giữ cho tất cả tên tệp/thư mục thường và do đó làm giống nhau khi bao gồm?

Thực tiễn tốt nhất, như mọi khi: Giữ mọi thứ nhất quán. Nếu bạn đang sử dụng các tệp nguồn/tiêu đề hỗn hợp trong dự án của mình, hãy tiếp tục sử dụng chúng và sao chép vỏ chính xác trong chỉ thị #include của bạn.

Các vấn đề liên quan