Comment identifier la plate-forme / le compilateur à partir de macros de préprocesseur?

J’écris un code multi-plateforme, qui devrait comstackr à Linux, Windows, Mac OS. Sur Windows, je dois supporter Visual Studio et Mingw.

Il y a des morceaux de code spécifiques à la plate-forme, que je devrais placer dans l’environnement #ifdef .. #endif . Par exemple, ici, j’ai placé un code spécifique à win32:

 #ifdef WIN32 #include  #endif 

Mais comment reconnaître Linux et Mac OS? Quels sont les noms définis (ou etc.) que je devrais utiliser?

Pour Mac OS :

 #ifdef __APPLE__ 

Pour MingW sous Windows:

 #ifdef __MINGW32__ 

Pour Linux :

 #ifdef __linux__ 

Pour les autres compilateurs Windows, vérifiez ce thread et ceci pour plusieurs autres compilateurs et architectures.

Voir: http://predef.sourceforge.net/index.php

Ce projet fournit une liste assez complète de définitions #defines pour de nombreux systèmes d’exploitation, compilateurs, normes de langage et de plate-forme et bibliothèques standard.

Voici ce que j’utilise:

 #ifdef _WIN32 // note the underscore: without it, it's not msdn official! // Windows (x64 and x86) #elif __unix__ // all unices, not all comstackrs // Unix #elif __linux__ // linux #elif __APPLE__ // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though... #endif 

EDIT: Bien que ce qui précède puisse fonctionner pour les bases, n’oubliez pas de vérifier quelle macro vous souhaitez vérifier en consultant les pages de référence Boost.Predef . Ou utilisez simplement Boost.Predef directement.

Si vous écrivez en C ++, je ne peux pas vous recommander d’utiliser suffisamment les bibliothèques Boost .

La dernière version (1.55) comprend une nouvelle bibliothèque Predef qui couvre exactement ce que vous recherchez , ainsi que des dizaines d’autres macros de reconnaissance de plate-forme et d’architecture.

 #include  // ... #if BOOST_OS_WINDOWS #elif BOOST_OS_LINUX #elif BOOST_OS_MACOS #endif