Savoir quel est le système d'exploitation sans de directive préprocesseurs

a marqué ce sujet comme résolu.

Bonjour,

Comme indiqué dans le titre j’aimerais savoir si il est possible de vérifier quel est le système d’exploitation utilisé par l’utilisateur sans utilisé de directive préprocesseur. Pourquoi ? -> Car un seul endroit dans mon code n’est pas portable (faire un fichier caché (appel système pour Windows et ’.’ avant le nom du fichier pour Linux (et Unix en général))), et que sa serait assez moche de refaire mon code entièrement juste pour une ligne ^^

Cordialement et Merci d’avance !

+0 -0

Dans ton code :

1
2
3
4
5
char* filename = ".hidden";

#ifdef _WIN32
      make_hidden(filename);
#endif

Voilà. C’est tout. Sur Windows, tu peux très bien utiliser un fichier préfixer d’un point. Il y a juste à le cacher si tu veux. Donc aucun aménagement à faire pour les systèmes Unix.

Et pour Windows, tu appeles la bonne fonction. Pour cela, tu utilises les directives de préprocesseur.

+0 -0

Merci de vos réponses ! C’est la première fois que j’utilise les directives préprocesseur et je ne savais pas qu’il était possible de les utilisés dans la fonction main et je viens de le voir sur le tuto de zeste de savoir (j’avais suivi d’OC et ils n’en parlent jamais)

+0 -0

Absolument.

C’est le préprocesseur, il s’en fiche que tu travailles dans le main, un autre fichier ou même du texte. Lui il agis avant le compilateur donc tu pourrais même travailler sur n’importequoi, le préprocesseur fonctionnerait.

+0 -0

Y’a aussi moyen de gérer ça en jouant sur les fichiers d’implémentation et gérer le choix de l’OS dans la configuration de projet

genre

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// taclasse.h

class TaClasse
{
  // ...
public:
  void log();

private:
  std::istream make_file();
};
1
2
3
4
5
6
7
8
// taclasse.cpp

void TaClasse::log()
{
  std::istream logfile = make_file();
  auto & now = std::chrono::system_clock::now();
  logfile << (now.hours()*3600+now.minutes()*60+now.seconds());
}
1
2
3
4
5
6
7
8
// taclasse_windows.cpp

std::istream TaClasse::make_file()
{
  const std::string filename = "hidden";
  make_hidden(filename);
  return std::istream(filename);
}
1
2
3
4
5
6
7
// taclasse_unix.cpp

std::istream TaClasse::make_file()
{
  const std::string filename = ".hidden";
  return std::istream(filename);
}

(bon le code est sûrement faux, j’ai pas fais les vérifications adéquats et j’ai pas regardé la doc de make_hidden, mais je pense qu’on comprend l’idée)

pour qu’ensuite ce soit la configuration de projet (donc make, cmake, Scons, qmake, premake, whatever …) qui choisisse le fichier d’implémentation en fonction du système ciblé pour que la compilation exécute soit g++ -c taclasse.cpp taclasse_windows.cpp soit g++ -c taclasse.cpp taclasse_unix.cpp

Bien sûr, les directives préprocesseur c’est mieux car ça n’affecte pas l’écriture de ta classe, et puisque tu n’as finalement pas de raison de ne pas les utiliser c’est sûrement la meilleur solution, mais je répond quand même à la question initiale, au cas où.

EDIT : Oops, le sujet est en C et j’ai fait du C++, mais l’idée est la même

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte