38 votes

Existe-t-il des macros pour déterminer si mon code est en cours de compilation vers Windows?

Je voudrais détecter si l'OS sur lequel je compile est Windows. Existe-t-il une macro simple que je peux vérifier pour le vérifier?

38voto

phord Points 2458

[Edit: je suppose que vous voulez utiliser au moment de la compilation des macros afin de déterminer dans quel environnement vous êtes sur. Peut-être que vous souhaitez afin de déterminer si vous êtes en cours d'exécution sur Wine sous Linux ou quelque chose à la place de Windows, mais en général, votre compilateur cibles dans un environnement spécifique, et qui est soit Windows (DOS) ou il ne l'est pas, mais c'est rarement (jamais?) les deux.]

Certains compilateurs offrent des macros pour indiquer un Windows environnement de construction. Mais elles varient d'un compilateur de compilateur, et même sur le même compilateur sous Windows si la cible de l'environnement n'est pas exclusivement windows. Habituellement, c'est __WIN32__, mais pas toujours.

#if defined (__WIN32__)
  // Windows stuff
#endif

Parfois, il peut être _WIN32, __CYGWIN32__, ou peut-être juste le compilateur indicateur (_MSC_VER).

Si vous connaissez l'environnement, vous serez en bâtiment (depuis le makefile), alors vous pouvez généralement passer dans l' #define sur la ligne de commande, comme "g++ -D __WIN32__ yourfile.c".

Un peu plus d'info ici

25voto

JesperE Points 34356

Il y a un certain nombre de différentes méthodes de détection, de compilation, d'accueil, et les environnements d'exécution. Tous les selon exactement ce que vous voulez savoir. Il existe trois grands types de milieux:

  • Construire: C'est l'environnement dans lequel le programme est compilé.
  • Hôte: C'est l'environnement dans lequel le programme est en cours d'exécution.
  • Cible: Dans le cas de la génération de code outils (tels que les compilateurs), c'est là que le code généré sera exécuté.

Si vous êtes à la cross-compilation, la génération de l'hôte et de l'environnement, peuvent être complètement différents (ce qui est fréquent lors de la construction d'applications embarquées, mais pas très commun lors de la construction de bureau/serveur d'applications), et en général, vous ne peut pas exécuter le binaire compilé sur le système utilisé pour la compilation. Sinon, l'hôte de l'environnement doit être compatible avec l'environnement de construction: par exemple, la construction d'une application sur XP qui fonctionne sur Vista.

Les macros du préprocesseur C ne peut pas être utilisé pour vous raconter les détails du système hôte (c'est à dire ce que vous en cours d'exécution sur); ils peuvent seulement vous dire ce que le code a été compilé. Dans le cas de windows, les deux plus importants des macros sont:

  • _WIN32 signifie que l'API Win32 est disponible. Il n'est pas de vous dire quel compilateur que vous utilisez, en fait _WIN32 est défini à la fois lors de l'utilisation de Cygwin de la GCC et de MinGW GCC. Donc, ne pas utiliser _WIN32 afin de déterminer si vous êtes d'être compilé avec Visual Studio.
  • _MSC_VER vous indique que le programme est compilé avec Microsoft Visual C/C++. Enfin, presque. _MSC_VER est également définie lors de l'utilisation d'Intel C++ compiler qui est destiné à être un remplacement drop-in pour Visual C++.

Il y a un tas d'autres macros décrites dans la documentation de Visual Studio.

Si vous voulez savoir à quelle version exacte de Windows que vous utilisez, vous devrez utiliser d'exécution des fonctions telles que GetVersion() (comme décrit dans les autres réponses).

Vous pouvez obtenir des réponses précises si vous nous avez dit exactement ce que vous souhaitez vérifier.

16voto

Mr.Ree Points 5112
 % touch foo.C ; g++ -dM -E foo.C
 

Fera un bon travail de listage de toutes les macros (# define's) définies automatiquement pour vous par votre compilateur g ++ [spécifique à la machine].

Il pourrait y avoir quelque chose de similaire pour les compilateurs de Microsoft ...

4voto

user51241 Points 66

Si vous exécutez du code ciblé MS Windows, vous pouvez appeler GetVersion () ou GetVersionEx () pour plus d'informations et pour identifier la variante de Windows sur laquelle vous exécutez.

Pour plus d'informations, consultez les informations MSDN.

http://msdn.microsoft.com/en-us/library/ms724451 (VS.85) .aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X