separateur de chemin : existe t'il une constante? [résolu] - C - Programmation
Marsh Posté le 29-08-2007 à 23:02:18
Pas à ma connaissance, mais le slash fonctionne aussi sous Windows (mais pas avec les commandes DOS).
Marsh Posté le 30-08-2007 à 09:48:05
pas en standard. Par contre y a plein de bibli (genre glib2) qui proposent des abstractions ou des fonctions comme g_build_filename ou g_build_path
Marsh Posté le 30-08-2007 à 14:36:29
Merci pour vos reponses.
1ere solution :
ne fonctionne pas car mon objectif est d'analyser argv[0] pour ne récupérer que le nom du binaire et mon pas tout le chemin d'accès : j'analyse la chaine de caractère à reculon et je récupère un pointeur sur le 1er "\" sous Windows ou "/" sous linux.
2eme solution :
m'embête un peu car l'objectif de l'appli est de tourner sur un OS minimal donc théoriquement sans glib ou autres.
Actuellement j'utilise un :
tant que != '\\' et != '/'
mais je ne trouve pas ca très élégant.
D'où ma deuxième question :
existe t'il un header definissant une constante dont la valeur est spécifique à chaque OS, sur laquelle je pourrait m'appuyer pour definir ma propre constante de séparateur de chemin.
merci
Marsh Posté le 30-08-2007 à 16:20:18
Hmm, en fait je suis quasiment sur que cette constante n'existe pas pour la raison que je t'ai donné dans ma première réponse : sur Windows, il n'y a pas un mais 2 séparateurs permis. Donc tu auras du mal à tester tous les cas avec une seule définition.
Marsh Posté le 30-08-2007 à 17:22:55
hmmm... je dit ça comme ça, mais le plus simple ne serait-il pas :
- une fonction char getSeparator(char*);
- une constante qui stocke le resultat de getSeparator.
Un postulat intelligent :
- Sous DOS/Win un executable est forcement un .EXE (voir .COM)
- Sous Linux en principe y'a pas d'extension.
Donc :
Si arg[0][length(arg[0]) - 5] == '.' Alors Windows
Sinon Linux
Marsh Posté le 30-08-2007 à 18:34:30
MEI a écrit : hmmm... je dit ça comme ça, mais le plus simple ne serait-il pas : |
Déjà faut pas ôter "5" mais "4". Ensuite ce n'est pas parce que ton pgm se nomme "toto.exe" que t'es pas sous Linux...
Maintenant il y a plein d'outils qui peuvent te donner le type de ton système en commençant par "uname"...
Et la fonction "strrchr" sera d'un grand secours pour trouver le dernier "/" (ou "\" )...
Marsh Posté le 30-08-2007 à 18:41:02
Bon allez j'vais vous montrer comment on code bien en C/C++/etc, parce que là vous etes risible un peu, on est pas en Java, on sais avant l'execution le systeme ciblé.
Code :
|
C'est pas plus compliqué que ça.
Tu rajoute la directive de compilation a ton makefile, et voilà.
Marsh Posté le 30-08-2007 à 19:32:04
MEI a écrit :
|
Le slash fonctionne aussi sous zindow...
MEI a écrit : Bon allez j'vais vous montrer comment on code bien en C/C++/etc |
Super. Tu définis une constante là où une macro peut suffire et surtout tu la nommes en majuscules et en plus tu résouds pas tous les cas. Tu es sûr de nous avoir montré tous tes talents C/C++ ???
Marsh Posté le 30-08-2007 à 19:43:02
1. J'ai le droit de nommer mes constante en majuscule si je veux.
2. Il peut rajouter autant de directive qu'il veut.
3. C'était une piste, et WIN32 est une directive de tout projet VC++ donc c'est déjà mieux que rien.
4. Le slash dans Windows Ouai bah tante sous Win9x et reviens.
EDIT : Pour la directive j'ai appliqué la doc du platform SDK moi einh. Apres si c'est pas C++ compliant ca compile sous Windows avec VS2002/2003/2005 et sous Linux avec GCC (plein de version suivant les serveur où je bossais).
Enfin toujours est-il que dans les grandes lignes je suis plus dans le vrai que ceux qui tante de detecter ça a l'execution.
En .NET/Java ou autres languages interpretés et multiplateforme il est "normal" de vouloir detecter à l'execution l'OS. Mais dans un langage compilé c'est à la compilation qu'on doit choisir c'tout.
Marsh Posté le 30-08-2007 à 19:46:02
MEI a écrit : Ouai bah tante sous Win9x et reviens. |
Ouaip, si ma tante en avait ce serait mon oncle...
Marsh Posté le 30-08-2007 à 19:46:38
Bah Win32 c'est de Win32S à Vista, par seulement à partir de XP
Marsh Posté le 30-08-2007 à 19:54:36
atshaw a écrit : |
Bah tu remplaces les \ par des / et ensuite le traitement est unique...
Code :
|
|
Marsh Posté le 30-08-2007 à 20:44:30
MEI a écrit : Bah Win32 c'est de Win32S à Vista, par seulement à partir de XP |
Ben justement => C'est pour ça qu'il ne faut pas oblitérer les slashes sous prétexte qu'on est sous zindow
Marsh Posté le 31-08-2007 à 13:59:38
Citation :
|
+1 pour MEI
C'est exactement ce que veux faire et c'est de loin, à mon avis, la manière la plus propre de procéder
Mais mon problème n'est toujours pas résolu car ce n'est pas d'un exemple dont j'ai besoin mais du nom du header definissant les constantes WIN32 et LINUX.
Aller, encore un petit effort et je note le post comme resolu (ce qui ne m'empêche pas de chercher de mon côté hein, vous inquiétez pas )
En tous cas merci à tous.
Marsh Posté le 31-08-2007 à 14:12:40
En fait non, en y reflechissant à deux fois, je n'ai pas besoin du nom du header
Donc merci
Marsh Posté le 31-08-2007 à 20:35:37
En y reflechissant à trois fois (j'ai un peu de mal) j'en ai besoin du nom de ce header car je doit l'inclure pour que WIN32 ou LINUX soit défini.
Toute proposition est la bienvenue.
Marsh Posté le 31-08-2007 à 20:39:51
Les directive c'est à la compilation.
Ca doit etre -D pour gcc de mémoire.
Marsh Posté le 31-08-2007 à 21:09:12
atshaw a écrit : En y reflechissant à trois fois (j'ai un peu de mal) j'en ai besoin du nom de ce header car je doit l'inclure pour que WIN32 ou LINUX soit défini. Toute proposition est la bienvenue. |
C'est ton compilateur qui définit automatiquement ces macros (lire la doc : "macros prédéfinies" ou "predefined macros" ).
En général, un compilateur Windows définit soit :
WINDOWS
_WINDOWS
_windows
WIN32
_WIN32
_win32
et un compilateur pour Linux :
linux
_linux
etc.
RTMF
Sinon, tu peux le faire toi-même avec des définitions globales à passer sur la ligne de commande (-Dxxx). a placer dans le makefile (un par système) ou dans un include séparé du makefile (un par système).
Marsh Posté le 31-08-2007 à 22:01:00
Bon ca y est, je m'en suis sorti.
Aucun header n'est necessaire. Du coup, je ne vois pas trop comment sont definies "WIN32" et "linux"
Si quelqu'un à une réponse à cela, je suis intéressé.
Peut être que MEI à tenté d'y répondre mais je n'ai pas compris ce qu'il voulait dire. Actuellement je n'ai pas besoin d'utiliser l'option -D de gcc.
A titre d'information pour les personnes se trouvant dans mon cas, le code exact est :
pour Windows / linux :
Code :
|
pour Windows / all unix
Code :
|
edit : merci à Emmanuel Delahaye pour son explication qui est survenue lorsque je préparait mon post (c'est la faute à la pause casse-croute )
Marsh Posté le 31-08-2007 à 22:24:23
atshaw a écrit : Du coup, je ne vois pas trop comment sont definies "WIN32" et "linux" |
Quels sont les mots que tu ne comprends pas dans
Citation : C'est ton compilateur qui définit automatiquement ces macros (lire la doc : "macros prédéfinies" ou "predefined macros" ). |
Marsh Posté le 31-08-2007 à 22:55:02
Aucuns, ton explication me convient. Mais comme indiqué, j'ai commencé d'ecrire mon message avant que tu ne poste le tiens et je ne l'ai réellement validé qu'après (bien après il est vrai). J'aurais du vérifier que rien avait été posté durant la pose casse-croute
Marsh Posté le 01-09-2007 à 09:48:59
http://predef.sourceforge.net
pour une liste aps crad de macros définis apr els compilateurs
Marsh Posté le 01-09-2007 à 10:02:26
Joel F a écrit : http://predef.sourceforge.net |
Enorme ! Merci, j'avais perdu ce lien.
Au fait, on dirait que certains de tes doigts sont branchés à l'envers !
Marsh Posté le 01-09-2007 à 19:01:29
gaucher contrarié tout ça ma main gauche va + vite que la droite
Marsh Posté le 01-09-2007 à 19:07:37
Extra la liste, c'est exactement ce que je cherchais.
Même si je n'en ai plus besoin pour le moment ça peut toujours servir pour plus tard...
Marsh Posté le 02-09-2007 à 01:16:07
comme dirait l'autre, ca m'a suavé ma vie (c)
Quand je pense au bordel moche que je foutais dans mes makefile avant de découvrir cette page
Marsh Posté le 29-08-2007 à 22:13:04
Bonjour,
Quelqu'un sait t'il s'il existe un header définissant une constante pour le séparateur de chemin en C. Et quelle est cette constante.
En gros, y a t'il un header existant sous la plupart des systeme d'exploitation qui dirait :
PATH_SEPARATOR = "/" sous linux
ou
PATH_SEPARATOR = "\\" sous Windows
...
Merci pour toute info.
Message édité par atshaw le 16-09-2007 à 20:29:28