Je porte une application écrite en C++ de Windows vers Linux. J'ai un problème avec le chemin des fichiers d'en-tête. Windows utilise \
et Linux utilise /
. Je trouve qu'il est fastidieux de changer cela dans chaque source et chaque fichier d'en-tête. Y a-t-il du travail?Inclure le changement de chemin d'en-tête de Windows vers Linux
Répondre
Toujours utiliser les barres obliques dans les chemins #include. Le travail du compilateur consiste à mapper le chemin vers le schéma slash/directory que le système d'exploitation sous-jacent prend en charge.
-1. IMHO vous répondez à la mauvaise question - le gars a déjà une pile de fichiers avec des chemins #include backslashed. Il a besoin d'une ambulance, pas quelqu'un pour lui dire qu'il n'aurait pas dû conduire si vite. –
Bonne question! Je suppose qu'il voulait dire qu'il voulait éviter d'avoir à changer continuellement entre/et \ alors qu'il se déplace entre les projets. (OP pourriez-vous clarifier s'il vous plait?) J'ai lâché mon -1 depuis évidemment l'opinion de l'OP sur ce que l'OP veut devancer le mien :) –
@j_random_hacker Ils portent (au moins, il était quand la question a été écrite) donc ils sont encore conduite et doivent encore s'écraser. Ignorer la direction des barres obliques dans leurs fichiers est une seule instruction perl. –
Quelle version de Windows utilisez-vous? Pour autant que je sache, à partir de Windows XP, les barres obliques fonctionnent comme des délimiteurs de chemin.
Je pense que l'OP va de Windows à Linux, pas de Linux à Windows –
en fait l'application est codée pour différentes plates-formes. Et j'utilise les fichiers codés par quelqu'un d'autre. Je suis intéressé de savoir s'il existe un moyen plus simple de changer les barres obliques inversées pour faire avancer les barres obliques ou obtenir un effet similaire. –
Utilisez toujours des barres obliques dans les directives #include. Certains systèmes d'exploitation/compilateurs l'exigent, et Windows/Visual Studio est assez intelligent pour le gérer correctement.
Depuis que vous avez commencé avec du code Windows, je suppose que vous avez Visual Studio. Utilisez la boîte de dialogue Rechercher et remplacer et créez une expression régulière qui effectuera la substitution pour vous. Exécutez la recherche et remplacez tous les fichiers.
Par exemple, utiliser quelque chose comme ceci:
#include:b+<{[^\\\>]}\\
pour votre expression de recherche et
#include <\1
pour le remplacer l'expression (avertissement: non testé). Exécutez ceci sur tous les fichiers jusqu'à ce qu'aucun remplacement ne soit effectué. Puis changez les parenthèses inclinées aux citations et répétez.
Les API Windows ont toujours pris en charge barre oblique comme séparateur de répertoire. Et c'est parce qu'au moins aussi DOS 3.1 était également supporté. Le problème a toujours été COMMAND.COM et CMD.EXE. Ils utilisent la barre oblique comme indicateur d'option (au lieu de tiret comme dans Unix). N'utilisez jamais de barres obliques inverses pour les séparateurs de répertoire dans les langues où une barre oblique inverse dans une chaîne est utilisée pour échapper des caractères spéciaux.
Si vous n'avez pas de shell Unix, n'avez-vous pas un éditeur qui effectue une recherche/un remplacement sur plusieurs fichiers? Heck, écrivez un petit programme pour le faire si vous devez. L'analyse du code source C++ pour ses instructions #include ne peut pas être difficile.
Il n'a pas toujours pris en charge barre oblique qui a été un gros problème pour les âges. Mais maintenant. –
Au moins de retour à DOS 4.0, il l'a fait. – jmucchiello
Joe: certainement pas vrai. Les compilateurs l'ont peut-être supporté pour includes, et l'interface utilisateur d'Explorer l'a certainement fait. Mais WinAPI en général n'a pas. –
Vous les gens! Oui, vous pouvez et devez toujours utiliser des barres obliques. Je pense que la question est comment obtenir là de ici!
Si vous avez Perl installé, une doublure suivant convertir un fichier source C++ pour utiliser des barres obliques, de sauvegarder la version originale dans un fichier avec l'extension .bak
:
perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp
(La ligne de commande ci-dessus est pour Windows: si vous utilisez Linux ou un autre shell de type Unix, utilisez des guillemets simples autour du 3ème paramètre au lieu de guillemets doubles.)
Si vous avez un tas de fichiers dont vous avez besoin de convertir, par exemple tous les fichiers se terminant par .cpp
:
for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f
La commande correspondante pour un environnement Bourne shell (shell Linux typique):
for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done
Si vous n'avez pas installé Perl, vous devriez pouvoir trouver un éditeur de texte qui permette la recherche et le remplacement entre les fichiers.
Vous pourriez vouloir utiliser un séparateur différent de! si vous utilisez tcsh. –
@mrree: Bon point. Aussi vous aurez besoin de changer quelque peu la syntaxe de la boucle for (j'oublie malheureusement la syntaxe exacte). –
foreach f (* .cpp) .... end; Je ne pense pas que vous puissiez tout faire sur une seule ligne ... –
Vous pouvez essayer cette commande basée sur commande précédente perl qui font le travail recusrively
find . -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/'
Lorsque vous enfin résoudre ce problème, rappelez-vous: jamais utiliser antislashs jamais. Les barres obliques directes fonctionnent à la fois sous Windows et Linux. –