Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1069 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  reconnaissance d'une variable d'environnement à la compilation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

reconnaissance d'une variable d'environnement à la compilation

n°1030039
nathan_g
Posté le 30-03-2005 à 17:08:29  profilanswer
 

Bonjour,
 
J'aimerais savoir comment forcer le compilateur à passer dans certaines parties d'un programme et pas d'autres, en fonctions de la valeur d'une variable d'environnement (si c'est possible). Ainsi, si on prend OS qui vaut 'Linux' sous le système Linux, j'aimerais quelque chose de reconnu au lancement du compilateur du genre :
 

Code :
  1. if (OS == 'Linux)
  2. compiler cette partie
  3. else if (OS == 'Windows)
  4. compiler cette autre partie
  5. endif


 
Est-ce que c'est réalisable (je crois que c'est le cas quand on cherche juste l'existence ou non d'une variable d'environnement) ? Comment dois-je m'y prendre ?
 
J'aimerais réaliser la même chose avec un programme fortran, est ce que la syntaxe est identique ?
 
Merci d'avance de votre aide,
 
 
 
 
 
 

mood
Publicité
Posté le 30-03-2005 à 17:08:29  profilanswer
 

n°1030081
IrmatDen
Posté le 30-03-2005 à 17:32:26  profilanswer
 

Pour la partie code il faut que tu utilises les #if/#elif/#endif en fonction d'un define que tu définirais dans ton makefile qui serais specifique à une plateforme.
Pour le fortran, joker j'y connais rien...

n°1030129
nathan_g
Posté le 30-03-2005 à 17:58:59  profilanswer
 

Oui, mais je voudrais faire quelque chose de plus sans passer, dans un premier temps, par un Makefile et en utilisant une variable d'environnement déja connue (du type de celle donnée par la commande " env " sous Linux).
 
Après, je voudrais insérer ces lignes dans un programme défini et non pas guider le Makefile en fonction de la valeur de telle ou telle variable.
 
Est-ce possible ?
 
Sinon, pour " #if ", comment faut-il compléter la ligne pour avoir quelque chose du genre " if (OS == 'Linux) " ? Est ce qqch comme #if eq(OS,'Linux') ?
Pourriez vous me donner la syntaxe exacte ?
 
D'avance merci,
 

n°1030168
IrmatDen
Posté le 30-03-2005 à 18:20:32  profilanswer
 

Le compilateur compile tout le source que lui transmets le précompilateur. Hors tu ne peux compiler que ce que ta plateforme connait car le C++ n'est pas multi-plateforme au même titre que le Java ce que j'ai l'impression que tu penses. Tu doit passer au minimum par une recompilation...
Exemple :

Code :
  1. #include <iostream>
  2. int main(int argc, char **argv)
  3. {
  4.    #if defined WIN32
  5.       std::cout << "je suis sur Windows";
  6.    #else if defined LINUX
  7.       std::cout << "je suis sur linux";
  8.    #endif
  9.    return 0;
  10. }


edit : et pour compiler sans passer par un makefile, tu dois saisir un #define LINUX ou #define WIN32 selon la plateforme sur laquelle tu compiles


Message édité par IrmatDen le 30-03-2005 à 18:22:22
n°1030179
ory
Posté le 30-03-2005 à 18:29:21  profilanswer
 

ou en paramètre au compilateur -DLINUX ou -DWIN32 non ?

n°1030183
IrmatDen
Posté le 30-03-2005 à 18:31:40  profilanswer
 

hum... oui j'ai oublié de le préciser :/

n°1030189
nathan_g
Posté le 30-03-2005 à 18:34:52  profilanswer
 

Ok, je crois comprendre le type de syntaxe que tu me conseilles. En gros, je dois passer la définition/non défintion de deux variables d'environnement. Je dois donc définir l'une ou l'autre au début de la compilation.
 
C'est ça ?
 
Ce que je souhaitais faire initialement, c'était conserver une même variable (ex : OS) , quelque soit la plateforme, et lui affecter une valeur précise, avant compilation. Ensuite, le compilateur aurait comparé la valeur de cette variable aux différentes valeurs proposées (ex : Linux, Windows ....) afin de choisir la partie du code à compiler. Est-ce que ce genre de syntaxe existe ou est-il impossible d'y faire appel ?
 
Merci déja de cet aide, en attendant la réponse à ces dernières questions,

n°1030192
nathan_g
Posté le 30-03-2005 à 18:39:03  profilanswer
 

Je sais que c'est ce genre de syntaxe que j'ai dans plusieurs makafiles que j'ai écrit et j'aurais voulu la transposer dans mes programmes.

n°1030309
IrmatDen
Posté le 30-03-2005 à 20:14:09  profilanswer
 

La seule chose que tu peux faire dans ce cas, c'est faire en sorte de n'utiliser que du code standard ou multiplateforme, ce qui ôte sans doute l'intérêt de l'éxécuter en fonction de l'OS. Sans indiscrétion, quel en serait l'utilité par exemple ?

n°1030716
nathan_g
Posté le 31-03-2005 à 09:39:02  profilanswer
 

En pratique, j'ai un code développé sous Visual C++ 6.0, pour Windows. Il y a plusieurs syntaxes du type USE DFPORT, typique de Windows. Je pourrais ne pas les compiler avec tes indications (avec #if defined), mais j'ai aussi d'autres choses plus génantes avec des chemins de fichier qui sont définies avec \ sous Windows et / sous Linux. Les chaines de caractères définissant ces chemins posent problème dès la compilation. Ainsi, sous Linux, la défintion de qqch du type :
 
PATH = E:\moncompte\mmon repertoire\monfichier
 
n'est pas acceptée car les caractères \ ne passent pas. Il faut écrire qqch du type:
 
PATH = /moncompte/mmon repertoire/monfichier
 
Ce que je voudrais c'est que dès la compilation, selon la valeur de la variable d'environnement OS, le compilateur passe par une ligne ou l'autre pour compiler et que le choix du chemin pour le fichier se fasse à ce moment là. On aurait :
 
[cpp]
 
if (OS == 'Linux)  
 
PATH = /moncompte/mmon repertoire/monfichier
 
else if (OS == 'Windows)  
 
PATH = E:\moncompte\mmon repertoire\monfichier  
 
endif
 
[\cpp]
 
Est ce que c'est possible ?

mood
Publicité
Posté le 31-03-2005 à 09:39:02  profilanswer
 

n°1030717
nathan_g
Posté le 31-03-2005 à 09:39:59  profilanswer
 

Problème avec les " cpp ". Je voulais écrire :
 
En pratique, j'ai un code développé sous Visual C++ 6.0, pour Windows. Il y a plusieurs syntaxes du type USE DFPORT, typique de Windows. Je pourrais ne pas les compiler avec tes indications (avec #if defined), mais j'ai aussi d'autres choses plus génantes avec des chemins de fichier qui sont définies avec \ sous Windows et / sous Linux. Les chaines de caractères définissant ces chemins posent problème dès la compilation. Ainsi, sous Linux, la défintion de qqch du type :  
 

Code :
  1. PATH = E:\moncompte\mmon repertoire\monfichier

 
 
n'est pas acceptée car les caractères \ ne passent pas. Il faut écrire qqch du type:  
 

Code :
  1. PATH = /moncompte/mmon repertoire/monfichier

 
 
Ce que je voudrais c'est que dès la compilation, selon la valeur de la variable d'environnement OS, le compilateur passe par une ligne ou l'autre pour compiler et que le choix du chemin pour le fichier se fasse à ce moment là. On aurait :  
 

Code :
  1. if (OS == 'Linux) 
  2. PATH = /moncompte/mmon repertoire/monfichier
  3. else if (OS == 'Windows) 
  4. PATH = E:\moncompte\mmon repertoire\monfichier 
  5. endif

 
 
Est ce que c'est possible ?

n°1030832
Lam's
Profil: bas.
Posté le 31-03-2005 à 11:24:23  profilanswer
 

Pour tes problèmes de chemins, utilise des chemins relatifs avec des simples slashs: ça passe sous tous les OS (y compris Windows.)
Donc:

PATH = moncompte/mon_repertoire/monfichier


 
Tu n'auras qu'à utiliser les répertoires d'include si ça marche pas super (-I/moncompte/mon_rep en ligne de commande du compilo sous unix).
 
 
Pour tes problèmes de USE, ça sera plutôt:

Code :
  1. #ifdef WIN32
  2.   lalala
  3. #else
  4.   // on est probablement sous Unix
  5.   lere lere lere
  6. #endif


 
Dernière feinte: le #ifdef qui va bien pour détecter Visual C++, c'est "_MSC_VER". Puisque "WIN32" est défini par tous les compilos sous Windows.


Message édité par Lam's le 31-03-2005 à 11:25:04
n°1031615
nathan_g
Posté le 31-03-2005 à 18:54:36  profilanswer
 

Bon, j'ai deux gros problèmes en travaillant sous Linux :
 
Pour les programmes C++, la syntaxe  
 

Code :
  1. #ifdef WIN32
  2.   lalala
  3. #else 
  4.   // on est probablement sous Unix  
  5.   lere lere lere
  6. #endif


 
est reconnue à la compilation qui s'éxécute normalement mais quelquesoit la variable WIN32, TOTO, TATA ... on y passe toujours. C'est à dire, que à l'éxécution lalala est toujours éxécuté :/
 
En fortran (je sais c'est pas trop le sujet ici ;) ), cette syntaxe en #ifdef/#else/#endif n'est absolument pas reconnue, quelquesoit le compilateur ! Pourtant, elle passe très bien sous Visual qui semble éxécuter la partie demandée.
 
Sauriez vous m'aider sur ces deux problèmes ?
D'avance merci !

n°1031631
nathan_g
Posté le 31-03-2005 à 19:24:35  profilanswer
 

Autant pour moi, cette syntaxe marche sous Linux, pour les programmes C++ avec le compilateur gcc ...
 
Mais avec le compilateur Portland pgCC, j'ai l'impression d'avoir plus de problème. Par exemple si lalala correspond à cout << "lalala" << endl; , la compilation ne se fait pas ! Si c'est a = 1+1, ça semble marcher.
 
Je vais essayer de comprendre ce qui se passe.
 
Par contre pour les programmes fortran, il me semble avoir toujours les mêmes soucis !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  reconnaissance d'une variable d'environnement à la compilation

 

Sujets relatifs
Meme variable dans plusieurs userformsComment modifier une variable passé en argument de fct par son adresse
entrer une variable d'un formulaire dans BDsavoir si une variable est un hash
[JS] Supprimer les retours à la ligne d'une variable [resolu]Recuperation Code Source d'une page ASP, pour mettre dans une variable
Récupérer une variable d'un applet dans un servletStocker une variable de session dans un BLOB et la recuperer?
[Javascript] nommer une variable à partir d'un string ?declaration de variable
Plus de sujets relatifs à : reconnaissance d'une variable d'environnement à la compilation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR