2009-07-14 3 views
10

Se si dispone di un file di intestazione denominato ThisIsAHeaderFile.h, il seguente sarà ancora individuare il file in Visual Studio:Come forzare la distinzione tra maiuscole e minuscole nel caso di Visual Studio con #include?

#include <ThisIsAheaderFile.h> 

C'è un modo per far rispettare la sensibilità caso in modo che il #include si tradurrà in un errore?

+0

Ho visto questo essere un problema quando si lavora con basi di codice Unix che possono utilizzare due versioni dello stesso nome di file, ma con case diverse. –

risposta

14

Non è possibile, perché il file system di Windows non è sensibile alla distinzione tra maiuscole e minuscole.

Se potessi entrare in una situazione in cui hai sia RICHIE.h che richie.h, potrebbe avere senso controllare la distinzione tra maiuscole e minuscole, ma non puoi.

+0

È possibile scrivere iF .. include ... piastra di riscaldamento per fare ciò per ogni file. WolfmanDragon

+5

In realtà, non è giusto. NTFS mantiene il caso di nomi di file come parte della conformità POSIX, ma mappa tutto in maiuscolo quando si eseguono operazioni sui file. http://blogs.msdn.com/michkap/archive/2005/01/16/353873.aspx –

+0

C++ gira su più di un semplice box di Windows. – WolfmanDragon

0

Sia FAT che NTFS sono file system senza maiuscole e minuscole. Foo e FOO sono lo stesso file per quanto riguarda loro. Sebbene il sistema operativo Windows conserverà il caso che usi per un file. Se si nomina un file ThisIsAheaderFile.h, verrà mostrato in questo modo nel file system. Sebbene tutte le chiamate di funzione di sistema per aprire quel file possano utilizzare qualsiasi involucro che desiderano.

+4

No, NTFS fa distinzione tra maiuscole e minuscole (o può essere fatto per essere con un'impostazione di registro). Win32, tuttavia, non fa distinzione tra maiuscole e minuscole. Solo FYI, dal momento che la risposta è sbagliata e tutto ... – jcolebrand

1

È (usato per essere?) Possibile creare file con lo stesso nome ma differenze tra maiuscole e minuscole su NTFS. Forse qualcuno con cygwin può verificarlo.

MSDN

Anche allora, però, è impossibile accedere a più di uno di questi alla volta da una normale applicazione di Windows.

+3

Sembra una buona ragione per non farlo. –

1

Anche se potrebbe non essere possibile applicarlo da Visual Studio, è possibile implementare un controllo rapido eseguendo solo il preprocessore sull'origine C/C++. Questo verrà eseguito abbastanza rapidamente da essere praticabile anche come post-commit hook in un sistema di controllo della versione, ed errare se il caso nei nomi dei file non è stato corrisposto. Quindi:

  • Configurare il sistema di compilazione in Linux per supportare preprocessore solo corre (-E con gcc/g++)

  • Implementare un preprocessore di sola esecuzione come post-commit hook, innescando una notifica presto per il responsabile e/o per qualcuno disposto a correggere questi errori di routine

Naturalmente, questo presuppone un VCS come deposito centrale per il codice.

+0

Questa è un'ottima soluzione, un'altra potrebbe essere un semplice script o un preprocessore in esecuzione come pre-commit sulla macchina dei committer e consentire all'utente di ripulirsi. – daramarak

+0

@daramarak: come può essere utile se il committer esegue un file system senza distinzione tra maiuscole e minuscole? – krlmlr

+0

Poiché lo script è in grado di rilevare il caso e mentre il preprocessore di mingw non fa distinzione tra maiuscole e minuscole (e sembra che non ci siano opzioni per attivarlo), gcc in cygwin farà distinzione tra maiuscole e minuscole. – daramarak

1

vorrei sottolineare che questo è non un problema irrisolvibile, come molti tentativi per puntare verso la OP. L'insensibilità del case è accanto al punto. Il punto è come Lorenz03Tx viene spiegato in un commento, anche se il file system è insensibile al maiuscolo o al minuscolo, il caso viene mantenuto, quindi può essere controllato.

Tali contromisure sono davvero ottime da avere quando si esegue lo sviluppo multipiattaforma e si impedisce molto dopo il lavoro quando il codice viene compilato per l'altra piattaforma. Per non dimenticare che rendendo il processo di compilazione più pignolo si potrebbero indurre abitudini migliori per gli sviluppatori, in quanto gradualmente saranno più coerenti come includere e denominare i file.

TL; DR

Una soluzione è quella di utilizzare uno script che esegue la scansione semplicemente i file di origine per includere dichiarazioni e cerca di far corrispondere loro lungo i sentieri includere.Tale script può essere aggiunto agli eventi post-build di Visual Studio e quindi eseguito ad ogni build, oppure (ispirato a krlmlr) usa il preprocessore di un compilatore che applica la distinzione tra maiuscole e minuscole.