IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

trouver mon OS


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut trouver mon OS
    salut tous,

    j'ai regardé pas mal de trucs sur le net et je n'ai pas trouvé une solution unique pour détecter sur quel OS je suis. es ce si complexe que cela ?

    j'aimerai que mon programme puisse détecter si je suis sous unix ou windows car j'aimerai générer des dossiers (donc avec une commande qui dépend de l'OS).

    je veux un code qui n'utilise pas de bibliothèques externe donc je laisse tomber toutes les solutions que j'ai pu trouver avec BOOST.

    1°) Pour le moment, les deux meilleurs bout de code que j'ai trouvé sont ceux ci dessous. Qu'en pensez vous ? sont il vraiment portable et indépendant du compilateur par exemple ?
    Si j'ai un windows ou linux ou max 64bits il ne va pas y avoir de soucis ?


    j'ai vu sur le net des codes très proche de ceci mais avec des underscore devant les win, ou linux, unix...Etc
    => du coup faut il mettre des _ ou non ? il y a t il une différence ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #if defined(WIN32) && !defined(UNIX)
    /* Do windows stuff */
    #elif defined(UNIX) && !defined(WIN32)
    /* Do linux stuff */
    #else
    /* Error, both can't be defined or undefined same time */
    #endif
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if defined __APPLE__ || defined linux
    # include <unistd.h>
    #elif defined ( WIN32 ) || defined ( WIN64 )
    # include <windows.h>
    #endif
    2°) ma deuxième partie de question est sur l'écriture de fichiers dans des dossiers.

    une fois que j'ai détecté mon OS comment lui dire d'écrire mon fichier "test.txt" dans le dossier "myFolder" ?

    ça doit être un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if (windows) {
    string PATH=system("dir myFolder");
    string pathPlusName=PATH+"test.txt";
    ofstream file(pathPlusName, ios::trunc);
    file << "blabla" << endl;
    file.close();
    } else {
    string PATH=system("mkdir myFolder");
    string pathPlusName=PATH+"test.txt";
    ofstream file(pathPlusName, ios::trunc);
    file << "blabla" << endl;
    file.close();
    }
    pourriez vous m'aidez svp car je galère trop avec ça

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    1) Les constantes sont dépendantes du compilateur. Il faut donc en gérer le maximum (heureusement il en existe pas des centaines ).
    2) non, c'est en utilisant des #if defined

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par transgohan Voir le message
    1) Les constantes sont dépendantes du compilateur. Il faut donc en gérer le maximum (heureusement il en existe pas des centaines ).
    2) non, c'est en utilisant des #if defined
    merci pour ta réponse.

    par contre pour le 1°) j'ai encore une interrogation :
    => où trouver la liste de toutes ces constantes dépendantes du compilateur ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La bonne réponse est d'éviter system(), et de ne pas utiliser de chemin absolu en dur.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Salut une possibilité sous Windows c'est d'appeler
    GetVersionEx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Si la fonction échoue alors l'OS n'est pas Windows, voir le MSDN si c'est bien ça

    Pour les constantes spécifiques à l'OS pour Windows ça se trouvera dans le MSDN

    Sinon comme le précise leternel, éviter d'appeler la fonction system()

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Salut une possibilité sous Windows c'est d'appeler
    GetVersionEx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Si la fonction échoue alors l'OS n'est pas Windows, voir le MSDN si c'est bien ça

    Pour les constantes spécifiques à l'OS pour Windows ça se trouvera dans le MSDN

    Sinon comme le précise leternel, éviter d'appeler la fonction system()
    Cela ne règle pas le problème, sous linux le programme ne compilera pas car windows.h n'existe pas.

    Quant à la liste des constantes je viens de retrouver mon lien favori : http://sourceforge.net/p/predef/wiki/OperatingSystems/

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci pour votre participation

    Citation Envoyé par transgohan Voir le message
    Quant à la liste des constantes je viens de retrouver mon lien favori : http://sourceforge.net/p/predef/wiki/OperatingSystems/
    super ça !

    mon problème est donc réglé

    pour le point 2°) ce que j'ai fais est bon sauf que je dois remplacer mon if else par des if defined ?

    ps: je ne suis pas habitué au macro d'où ma question

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    les macros sont traités par le préprocesseur.

    En gros, si ton source est ainsi constitué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define x truc
    #define f(a,b) ((a)+(b))
    int main(){
    int x = 3, y =7;
    return f(x,y);
    }
    le source effectivement compilé sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(){
    int truc = 3, y =7;
    return ((truc) + (y));
    }
    pour le voir, joue avec "gcc -E".

    Chaque #include est remplacé par le fichier inclus dans la source en cours de traitement, et la première ligne de ce fichier sera donc la prochaine à être prétraitée.

    #if utilise une condition pour le préprocesseur.
    #define sert à définir un symbole, avec sa valeur textuelle éventuellement
    #ifdef truc vaut #if defined(truc), sauf que ce dernier permet l'enchainement tel que #if defined(A) || defined(B).

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci pour ces complements !

    => les commandes de pré compilateur sont forcement toujours portable ?

  10. #10
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Les commandes oui, elle font parties de la spécification du C++ :
    • #if
    • #elif
    • #else
    • #endif
    • #ifdef
    • #ifned
    • #define
    • #undef(doute…)
    • les opérateurs defined(), &&, ||, ## (concaténation textuelle), et # (non expansion de macro), ainsi que des operateurs algébriques (au moins les comparaisons)


    Par contre, les macros sont définies par trois sources:
    1. La commande de compilation: g++ -DTRUC=2 -c code.cpp compile code.cpp comme si #define TRUC 2 était ajouté avant la première ligne.
    2. Le compilateur lui-même: un certain nombre de macro, telle que __linux__ quand on compile sous linux
    3. Le code source, via les appels à #define

    Ces macros ne sont pas vraiment "portables".
    Le premier cas dépend de l'utilisateur (ou du makefile...)
    La liste de macros venant du compilateur est liée à sa version et à d'autre options de compilation (spécialement celle d'architecture).
    Les macros du code source sont forcément portables, vu qu'elles sont dans les sources

    Enfin, j'aurai pu le dire plutot, les macros sont définissent des remplacements de texte, un peu comme les expressions de sed, ou un bon vieux "remplacer" dans un éditeur de texte.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par leternel Voir le message
    # (non expansion de macro)
    Que veux-tu dire par là ?
    Le # sert à créer des const char*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TOSTR(str) #str
    TOSTR(ma chaine); // "ma chaine"
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    c'était mal dit, mais c'était mon propos. Je pensais à un truc assez moche que j'ai déjà rencontré plusieurs fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define show(x) #x << '=' << (x)
    ce qui permet d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout <<show(x) << ' '<< show(y)<<std::endl;

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci pour votre aide, je pense avoir tout les éléments
    à présent pour m'en sortir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aidez moi à trouver mon école
    Par casabest dans le forum Etudes
    Réponses: 2
    Dernier message: 30/11/2008, 20h38
  2. Trouver mon Mac
    Par lastrecrue dans le forum Réseau
    Réponses: 0
    Dernier message: 18/06/2008, 08h27
  3. Réponses: 1
    Dernier message: 28/02/2008, 10h13
  4. [Configuration] Où trouver mon php.ini
    Par ofaul dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 31/10/2007, 17h17
  5. comment vous trouver mon site www.dari-dz.com
    Par dari-dz dans le forum Mon site
    Réponses: 1
    Dernier message: 16/04/2007, 17h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo