8
votes

Détecter si le système d'exploitation Windows en C ++

Comment puis-je détecter si le système d'exploitation est Windows en C ++ / C?


6 commentaires

Comment compilez-vous le code binaire compatible avec plusieurs systèmes d'exploitation?


Vous demandez-vous du temps de compilation ou de l'exécution?


Runtime, lorsque le programme fonctionne


Vous ne devriez pas avoir à le faire du tout, en considérant que vous devrez construire du code qui fonctionne sous Windows, qui est incompatible avec des binaires que vous construiriez pour Linux, Mac ou FreeBSD, etc. Lisez vos autres commentaires, ce que vous avez Virez-vous vraiment est de compiler la détermination de l'heure de construction de code spécifiquement pour Windows.


Lorsque vous compilez un programme jusqu'à "Code natif" (code de machine spécifique à la CPU), vous devez normalement cibler un système d'exploitation spécifique (et sa version souvent) que l'exécutable résultant sera en mesure de fonctionner. Ceci est différent des langages interprétés comme Ruby ou Java où un programme de code natif existe pour lire le code source ou une représentation de celui-ci ("code octet") qui représente le programme. Néanmoins, il vous est possible de compiler un programme Windows et de l'exécuter sous un émulateur Windows, tel que le vin de Linux, c'est ce que vous voulez pouvoir reconnaître?


Vous ne pouvez pas le faire au moment de l'exécution, car le processus de compilation crée un code pour une plate-forme spécifique. Il ne fonctionnera tout simplement pas sur d'autres plates-formes; Vous devez recompiler pour eux. Par conséquent, votre programme Windows est Toujours en cours d'exécution sous Windows, car sinon il ne fonctionne pas du tout.


3 Réponses :


3
votes

Vous pouvez utiliser getenv () de cstdlib comme: xxx

si vous obtenez null null Ensuite, ce n'est pas des fenêtres.

Ceci fonctionne depuis % windir% ne doit être défini que sur les systèmes Windows. C'est un piratage bon marché et sale.

http: //www.cplusplus.com/reference/clibrary/cstdlib/getenv/


3 commentaires

Je suis assez certain que cela fait c'est mauvais.


C'est un hack. Vous pouvez également utiliser getenv ("OS") et vérifier "Windows" et "Windows_NT", mais cela nécessite une manipulation de la mémoire. Il existe d'autres méthodes formelles à ce que cette fonction devrait être distincte des bibliothèques C standard.


-1: Je peux définir Windir sur Linux ...



35
votes
#ifdef _WIN32
cout << "This is Windows." << endl;
#endif
This will allow you define blocks for windows only. As long as the preprocessor macro is defined. This is a compile time thing, not a runtime thing. 

1 commentaires

Cela fonctionnera-t-il pour Windows 64 bits? Je peux tester un succès, mais peut-être la peine d'être modifiée pour les futurs lecteurs.



0
votes

Si c'est le temps d'exécution, vous pouvez vous référer au vin (sur des systèmes d'exploitation non-Windows). Sinon, c'est tout simplement impossible. Les binaires Windows ne peuvent pas courir dans d'autres systèmes d'exploitation (sauf s'ils ont du vin).

Si c'est le temps de compilation, dupliquer possible: y a-t-il macros pour déterminer si mon code est compilé vers Windows?

(voir réponse acceptée ci-dessus)


0 commentaires