321 votes

Comment vérifier le système d'exploitation avec une directive du préprocesseur ?

J'ai besoin que mon code fasse différentes choses en fonction du système d'exploitation sur lequel il est compilé. Je cherche quelque chose comme ça :

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

Y a-t-il un moyen de faire cela ? Existe-t-il un meilleur moyen de faire la même chose ?

1 votes

11 votes

@Cory Klein : Non, non. Cette question a été posée des années auparavant.

0 votes

Il s'agit de C pas C++

471voto

Lambda Fairy Points 2353

El Macros prédéfinies pour l'OS a une liste très complète de contrôles. Voici quelques-uns d'entre eux, avec des liens vers les sites où ils se trouvent :

Windows

_WIN32    32 bits et 64 bits
_WIN64    64 bits uniquement
__CYGWIN__

Unix (Linux, *BSD, mais aussi Mac OS X)

Ver esto Question connexe sur certains des pièges de l'utilisation de ce contrôle.

unix
__unix
__unix__

Mac OS X

__APPLE__ Également utilisé pour le classique
__MACH__

Les deux sont définis ; la vérification de l'un ou l'autre devrait fonctionner.

Linux

__linux__
linux Obsolète (non conforme à POSIX)
__linux Obsolète (non conforme à POSIX)

FreeBSD

__FreeBSD__

Android

__ANDROID__

3 votes

Ce site donné n'inclut pas iOS, il ne parvient donc pas à faire la distinction entre iOS et OS X.

4 votes

Mac OS ne définit pas __unix__ . Pourquoi l'inclure dans la liste ?

4 votes

Cpp -dM /dev/null vous donnera une liste de toutes les macros prédéfinies de gcc sur votre version de gcc installée.

87voto

qwer Points 339

Montrer les définitions de GCC sous Windows :

gcc -dM -E - <NUL:

sur Linux :

gcc -dM -E - </dev/null

Macros prédéfinies dans MinGW :

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

sur les UNIX :

unix __unix__ __unix

1 votes

Windows et Unice ne sont pas les seuls systèmes d'exploitation.

0 votes

C'est pratique, mais notez que unix , __unix__ , __unix ne fonctionnent pas sur macOS, où seule la fonction __APPLE__ y __MACH__ sont définis.

58voto

hayalci Points 2161

Il existe des macros prédéfinies qui sont utilisées par la plupart des compilateurs, vous pouvez trouver la liste ici

Sinon, vous devrez ajuster le système de construction pour qu'une macro comme OS_WINDOWS/OS_UNIX soit définie pendant la compilation, puis vous devrez la vérifier dans le code en utilisant ifdef.

#ifdef OS_WINDOWS
   //define something for Windows
#else
  //define it for a Unix machine
#endif

10voto

Loki Astari Points 116129

Les macros prédéfinies du compilateur Microsoft C/C++ (MSVC) peuvent être trouvées aquí

Je pense que vous cherchez :

  • _WIN32 - Défini comme 1 lorsque la cible de compilation est 32-bit ARM, 64-bit ARM, x86, ou x64. Sinon, indéfini
  • _WIN64 - Défini comme 1 lorsque la cible de compilation est ARM 64 bits ou x64. Sinon, indéfini.

Les MAcros pré-définies du compilateur gcc peuvent être trouvées aquí

Je pense que vous cherchez :

  • __GNUC__
  • __GNUC_MINOR__
  • __GNUC_PATCHLEVEL__

Faites une recherche google pour vos compilateurs appropriés prédéfinis.

8voto

quinmars Points 4241

Dans la plupart des cas, il est préférable de vérifier si une fonctionnalité donnée est présente ou non. Par exemple : si la fonction pipe() existe ou non.

3 votes

Existe-t-il un moyen simple de vérifier si une fonction est définie ?

1 votes

Si vous utilisez autoconfig, vous pouvez vérifier les fonctions avec AC_CHECK_FUNCS(). AC_CHECK_FUNCS(pipe sqrt) définira HAVE_PIPE et HAVE_SQRT si les fonctions sont disponibles. Je ne sais pas comment cela se passe avec d'autres outils de construction, mais je suppose qu'ils supportent aussi cela d'une certaine manière.

0 votes

@MDXF A partir de C++17, il y a __has_include. Je ne pense pas qu'elle soit encore standardisée en C, mais tous les principaux compilateurs (GCC, Clang, ICC, MSVC) l'implémentent comme une extension spécifique au fournisseur, même en mode C.

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