web-dev-qa-db-fra.com

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

J'écris un code multi-plateforme, qui devrait être compilé sous Linux, Windows, Mac OS. Sur Windows, je dois prendre en charge Visual Studio et Mingw.

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

#ifdef WIN32
#include <windows.h>
#endif

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

111
Arenim

Pour Mac OS :

#ifdef __Apple__

Pour MingW sous Windows:

#ifdef __MINGW32__

Pour Linux :

#ifdef __linux__

Pour les autres compilateurs Windows, recherchez ce fil et this pour plusieurs autres compilateurs et architectures.

129
karlphillip

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

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

59
John Bartholomew

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 compilers
    // 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, pensez à vérifier la macro que vous souhaitez vérifier en regardant le Boost.Predef pages de référence . Ou utilisez simplement Boost.Predef directement.

44
rubenvb

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

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

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#Elif BOOST_OS_LINUX

#Elif BOOST_OS_MACOS

#endif
19
rvalue