2009-07-14 6 views
10

Si vous avez un fichier d'en-tête nommé ThisIsAHeaderFile.h, ce qui suit localisera toujours le fichier dans Visual Studio:Comment forcer la sensibilité à la casse du préprocesseur Visual Studio aveC#includes?

#include <ThisIsAheaderFile.h> 

Est-il possible de faire respecter la casse afin que le #include se traduira par une erreur?

+0

J'ai vu cela être un problème lorsque vous travaillez avec des bases de code Unix qui peuvent utiliser deux versions du même nom de fichier, mais avec des cas différents. –

Répondre

14

Vous ne pouvez pas, car le système de fichiers Windows est lui-même insensible à la casse.

Si vous pouviez entrer dans une situation où vous possédiez à la fois RICHIE.h et richie.h, il peut être judicieux de contrôler la sensibilité à la casse, mais vous ne pouvez pas le faire.

+0

Vous pouvez écrire iF .. inclut ... plaque de chaudière pour ce faire pour chaque fichier. WolfmanDragon

+5

En fait, ce n'est pas tout à fait raison. NTFS conserve la casse des noms de fichiers dans le cadre de la conformité POSIX, mais mappe tout en majuscules lors des opérations de fichiers. http://blogs.msdn.com/michkap/archive/2005/01/16/353873.aspx –

+0

C++ s'exécute sur plusieurs boîtes Windows uniquement. – WolfmanDragon

0

FAT et NTFS sont des systèmes de fichiers insensibles à la casse. Foo et fOO sont le même fichier en ce qui les concerne. Bien que le système d'exploitation Windows conservera le cas que vous utilisez pour un fichier. Si vous nommez un fichier ThisIsAheaderFile.h, il s'affichera dans le système de fichiers. Bien que tous les appels de fonction système pour ouvrir ce fichier peuvent utiliser n'importe quel boîtier qu'ils veulent.

+4

Non, NTFS est sensible à la casse (ou peut être créé avec un paramètre de registre). Win32, cependant, est insensible à la casse. Juste FYI, puisque la réponse est fausse et tout ... – jcolebrand

1

Il est possible de créer des fichiers avec le même nom mais avec des différences de casse sur NTFS. Peut-être que quelqu'un avec cygwin peut vérifier cela.

MSDN

Même alors, cependant, il est impossible d'accéder à plus d'un d'entre eux à un moment d'une application normale de Windows.

+3

Cela ressemble à une vraie bonne raison de ne pas le faire. –

1

Bien qu'il ne soit peut-être pas possible de l'appliquer à partir de Visual Studio, vous pouvez implémenter une vérification rapide en exécutant uniquement le préprocesseur sur la source C/C++. Cela fonctionnera assez rapidement pour être praticable même après un commit post-commit dans un système de contrôle de version, et se trompera si le cas dans les noms de fichiers a été incompatible. Alors:

  • Configurez votre système de construction sous Linux pour soutenir fonctionne préprocesseur uniquement (-E avec gcc/g++)

  • Mettre en œuvre un préprocesseur uniquement exécuté en tant que post-commit hook, ce qui déclenche une notification rapide à la personne responsable et/ou à quelqu'un prêt à corriger régulièrement ces erreurs

Bien sûr, cela suppose un VCS que le stockage central pour le code.

+0

Ceci est une excellente solution, un autre serait un simple script ou un préprocesseur en cours d'exécution comme pré-commit sur la machine committers, et laisser l'utilisateur se nettoyer lui-même. – daramarak

+0

@daramarak: Comment cela aidera-t-il si le committer utilise un système de fichiers insensible à la casse? – krlmlr

+0

Comme le script est capable de détecter le cas, et bien que le préprocesseur mingw soit insensible à la casse (et qu'il semble n'avoir aucune option pour l'activer), gcc dans cgwin sera sensible à la casse. – daramarak

1

Je tiens à souligner que c'est pas un problème insoluble autant de tentatives de signaler à l'OP. L'insensibilité à la casse est hors sujet. Le point est Lorenz03Tx explique dans un commentaire, même si le système de fichiers est insensible à la casse, le cas est conservé, de sorte qu'il peut être contrôlé.

Une telle contre-mesure est vraiment géniale à faire lors du développement multi-plateforme, et empêche beaucoup après le travail lorsque le code est compilé pour l'autre plate-forme. Ne pas oublier que rendre le processus de construction plus difficile vous induirait de meilleures habitudes pour les développeurs, car ils seront progressivement plus cohérent comment ils incluent et nomment les fichiers.

TL; DR

Une solution consiste à utiliser un script qui analyse simplement les fichiers sources pour inclure des déclarations et essaie de faire correspondre le long des chemins à inclure.Un tel script pourrait être ajouté aux événements post-build de Visual Studio, et ainsi fonctionner à chaque génération, ou (inspiré par krlmlr) utiliser le préprocesseur d'un compilateur qui applique la sensibilité à la casse.

Questions connexes