2009-12-23 10 views
8

Biorąc to drzewo katalogów:Czy w przypadku plików nagłówkowych uwzględniana jest wielkość liter?

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

file.cpp: 

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

Kompilacja file.cpp działa z VS, nie w gcc.

  • Co oznacza standard?
  • Jeśli w ścieżce rozróżniana jest wielkość liter, dlaczego tak jest?
  • Jaka jest najlepsza praktyka, zachowaj wszystkie nazwy plików/folderów małymi literami, a tym samym wykonaj to samo, gdy uwzględnisz?

Dzięki.

Odpowiedz

21

Wielkość liter zależy od systemu operacyjnego. System Windows nie rozróżnia wielkości liter. Linux jest.

EDIT:

Faktycznie, jak zauważył Martin York „s komentarzu, czułość sprawa zależy od systemu plików. Domyślnie system Windows używa systemu plików niewrażliwego na wielkość liter, podczas gdy system Linux używa wielkości liter. Dla każdego, kto chciałby wiedzieć, które systemy plików są wrażliwe na wielkość liter, a które nie, jest obszerna lista na Wikipedii: Comparison of file name limitations.

+0

Właściwie jest to bardziej związane z systemem plików, w przeciwieństwie do systemu operacyjnego. Wartość domyślna jest taka, jak zdefiniowano powyżej. Ale w Linuksie jest większa wersja systemu plików, z których niektóre nie są wrażliwe na wielkość liter. –

+0

@Martin: Tak, masz rację. Dziękuję za dokładną obserwację. –

+1

Więc wrażliwość na wielkość liter nie jest określona przez C89/99/++ 11? czy standard mówi, że w ścieżkach wyszukiwania i nazwach plików nie ma znaczenia wielkość liter? –

0

Nie jest to standard C++, w tym systemie Linux, w którym wszystkie nazwy ścieżek uwzględniają wielkość liter. Najlepsza praktyka również wybrała dowolną nazwę pliku (głównie małą) i używa tego samego przypadku w dyrektywie włączania. Zawsze używaj także względnych ścieżek plików.

+0

Obawiam się, jesteś w błędzie. To ** jest ** standardem C++, który kontroluje to i pozwala dowolnej implementacji wykonać wyszukiwanie według własnego uznania. – IInspectable

1

Kolejny punkt, o którym należy pamiętać to separator ścieżek o numerze. Nawet jeśli Visual Studio (i inne IDE systemu Windows, jestem tego pewien) zaakceptuje "/" lub "\", zawsze powinieneś używać '/' w ścieżce include dla przenośności.

+2

Dla lepszej przenośności, takiej jak przenoszenie plików źródłowych, ścieżki nie powinny znajdować się w kodzie źródłowym, ale powinny być przekazywane kompilatorowi. Jeśli pliki nagłówkowe się poruszają, cały kod odwołujący się do nich ścieżką musi zostać zmieniony i przetestowany pod względem regresji! –

+0

@ThomasMatthews Nigdy o tym nie myślałem. W jaki sposób uwzględnić nagłówki bez korzystania z ich podfolderów? – NicoBerrogorry

1

Co oznacza standard?

wrażliwość Sprawa w #include dyrektyw jest kontrolowany przez implementację (kompilator/preprocesora). Jest to wyjaśnione w 16.2.2 [cpp.include]

Dyrektywa A obróbki wstępnej formy
# include < h-char-sequence> new-line
wyszukiwania sekwencji miejsc realizacji zdefiniowanej dla nagłówka jednoznacznie poprzez określonej sekwencji pomiędzy < i > ograniczniki i powoduje zastąpienie tej dyrektywy przez całą zawartość nagłówka. Sposób określania miejsc lub zdefiniowany nagłówek jest zdefiniowany przez implementację.

Podobnie 16.2.3 [cpp.include]

Dyrektywa przerób formy
# include " q-char-sequence" new-line
powoduje zastąpienie dyrektywy przez całą zawartość pliku źródłowego zidentyfikowanych w określonej sekwencji między ogranicznikami ".Nazwany plik źródłowy jest wyszukiwany w sposób określony przez implementację. Jeśli wyszukiwarka nie jest obsługiwany, lub jeśli poszukiwania nie powiedzie, dyrektywa jest przetworzony tak, jakby czytać
# include < h-char-sequence> new-line
z identycznej sekwencji zawartych (w tym > znaków, jeśli w ogóle) z pierwotnej dyrektywy.

naturalnym wyborem dla implementacji języka jest użycie wielkości liter systemu plików lub systemu operacyjnego, ale nie ma ścisły wymóg, aby to zrobić (jak wszystkie inne odpowiedzi sugerują).

Co to jest najlepsza praktyka, zachowaj wszystkie nazwy plików/folderów małymi literami, a tym samym wykonaj to samo, gdy w tym?

Najlepsza praktyka, jak zawsze: Zachowaj spójność. Jeśli w projekcie używasz plików źródłowych/nagłówkowych o różnych wielkościach, używaj ich i replikuj dokładnie obudowy w swoich dyrektywach #include.

Powiązane problemy