Quando si includono i file di intestazione, il percorso è sensibile al maiuscolo / minuscolo?

Dato questo albero di directory:

src/MyLibrary/MyHeader.h src/file.cpp file.cpp: #include "mylibrary/myheader.h" ... 

La compilazione di file.cpp funziona con VS, non riesce in gcc.

  • Cosa dice lo standard?
  • Se il percorso è case sensitive, perché è saggio?
  • Qual è la migliore pratica, mantenere tutti i nomi di file / cartelle in minuscolo e quindi fare lo stesso quando include?

Grazie.

La distinzione tra maiuscole e minuscole dipende dal sistema operativo. Windows non è case sensitive. Linux è.

MODIFICARE:

In realtà, come osservato dal commento di Martin York , la distinzione tra maiuscole e minuscole dipende dal file system. Per impostazione predefinita, Windows utilizza un file system senza distinzione tra maiuscole e minuscole, mentre Linux utilizza uno sensibile al maiuscolo / minuscolo. Per chiunque sia interessato a sapere quali file system sono case sensitive e quali no, c’è un elenco completo su Wikipedia: Confronto delle limitazioni del nome del file .

Cosa dice lo standard?

La distinzione tra maiuscole e minuscole nelle direttive #include è controllata dall’implementazione (compilatore / preprocessore). Questo è spiegato in 16.2.2 [cpp.include]:

Una direttiva di pre-elaborazione del modulo
# include < h-char-sequence> new-line
ricerca una sequenza di luoghi definiti dall’implementazione per un’intestazione identificata univocamente dalla sequenza specificata tra i delimitatori < e > e causa la sostituzione di tale direttiva con l'intero contenuto dell'intestazione. Come vengono specificati i posti o l'intestazione identificata è definita dall'implementazione.

Allo stesso modo, 16.2.3 [cpp.include]:

Una direttiva di pre-elaborazione del modulo
# include " q-char-sequence" new-line
causa la sostituzione di tale direttiva con l'intero contenuto del file di origine identificato dalla sequenza specificata tra i " delimitatori " Il file di origine denominato viene cercato in un modo definito dall'implementazione. Se questa ricerca non è supportata o se la ricerca non riesce , la direttiva viene rielaborata come se leggesse
# include < h-char-sequence> new-line
con la sequenza identica contenuta (compresi i caratteri, se ce ne sono) dalla direttiva originale.

Una scelta naturale per l'implementazione della lingua è l'utilizzo della distinzione tra maiuscole e minuscole del filesystem o del sistema operativo, ma non vi è alcun obbligo rigoroso di farlo (come suggeriscono tutte le altre risposte).

Qual è la migliore pratica, mantenere tutti i nomi di file / cartelle in minuscolo e quindi fare lo stesso quando include?

Le migliori pratiche, come sempre: mantenere le cose coerenti. Se nel progetto si utilizzano file di origine / intestazione con maiuscole e minuscole, continuare a utilizzarli e replicare l'involucro esatto nelle direttive #include .

Un altro punto da ricordare è il carattere del separatore del percorso . Anche se Visual Studio (e altri IDE Windows sono sicuro) accetterà “/” o “\”, dovresti sempre usare “/” all’interno di un percorso di inclusione per la portabilità.

Non è lo standard C ++, è il modo Linux, in cui tutti i nomi dei percorsi sono case sensitive. La migliore pratica è anche scegliere qualsiasi nome di file che si desidera (principalmente in minuscolo) e utilizzare lo stesso caso nella direttiva include. Utilizza sempre anche percorsi di file relativi.