Comment identifier plate-forme/compilateur de macros du préprocesseur?
Je suis en train d'écrire une croix-plate-forme de code, qui devrait compiler sur linux, windows, Mac OS. Sur windows, je dois en charge de visual studio et mingw.
Il y a quelques morceaux de plate-forme spécifique de code, je devrait mettre en #ifdef .. #endif
de l'environnement. Par exemple, ici, j'ai placé le code spécifique win32:
#ifdef WIN32
#include <windows.h>
#endif
Mais comment puis-je reconnaître linux et mac OS? Quelles sont définit les noms (ou etc.) Je devrais utiliser?
- Voici OS macro définir la liste.
- La dupe est beaucoup mieux accepté de répondre.
- L'proposé en double n'est PAS la même question. Cette question ne demande qu'à propos de l'identification du système d'exploitation, alors que cette question pose aussi des questions sur l'identification du compilateur, qui est une chose très différente.
- encore accepté la réponse ne fait même pas mention des compilateurs, et ne parle que de Systèmes d'exploitation (et d'une "plate-forme"). Pour ne pas mentionner que c'est une terrible réponse par rapport à ce que la dupe a à offrir.
- Puis les lier à la question en commentaire. Juste parce qu'il a une meilleure réponse, ne pas faire un doublon. La question est de savoir ce qui détermine si c'est un doublon, pas les réponses. La fermeture de celle-ci ne garantit que nous ne serez jamais obtenir une bonne qualité de réponse pour le compilateur liés à la partie de la question, dont le soi-disant "double" ne peut pas toujours répondre.
- Je ne peux ré-accepter la meilleure réponse quand il apparaîtra. )
- double possible de Comment puis-je vérifier l'OS avec une directive de préprocesseur?
- Vous devriez plutôt utiliser
_WIN32
au lieu deWIN32
. stackoverflow.com/questions/9025708/... - Rien ne pourra te sauver sur sous Solaris de Sun Studio.... Vous définit peut-être l'habitude de voir, comme
__SSE2__
ne sont pas présents. Et il n'y a aucun moyen de savoir qui-xarch=X
a été spécifié, comme-xarch=sse4_2
,-xarch=aes
ou-xarch=avx_i
.
Vous devez vous connecter pour publier un commentaire.
Pour Mac OS:
Pour MingW sur Windows:
Pour Linux:
Pour les autres compilateurs pour Windows, vérifiez ce fil et cette pour plusieurs autres compilateurs et des architectures.
__APPLE__
distinguer entre OSX et iOS?__APPLE__
est pour OS X et iOS. Vous pouvez#include <TargetConditionals.h>
à l'intérieur de#ifdef __APPLE__
, qui vous donne unTARGET_OS_IPHONE #define
.__MINGW64__
est également disponible lorsque l'on utilise mingw64__MINGW64__
est référencé, pense_MSC_VER
pour Windows/MSVC mérite (qui peut également être utilisé pour vérifier MSVC Version).__MINGW64__
n'est pas approuvé par le MinGW-w64 auteurs, au lieu de cela, vous devriez vérifier pour__MINGW32__
,#include <_mingw.h>
si elle est définie, et vérifier__MINGW64_VERSION_MAJOR
.Voir: http://predef.sourceforge.net/index.php
Ce projet prévoit raisonnablement une liste complète de pré-définies
#defines
pour de nombreux systèmes d'exploitation, compilateurs, de la langue et de la plate-forme de normes, et les bibliothèques standard.Voici ce que j'utilise:
EDIT: Bien que le ci-dessus pourrait fonctionner pour les bases, n'oubliez pas de vérifier ce que la macro que vous souhaitez vérifier en regardant le Coup de pouce.Predef pages de référence. Ou tout simplement utiliser Boost.Predef directement.
#if
demander si elle est définie, les autres test de valeur. Si serait plus cohérent de faire#elif defined(__unix__)
, etc, je pense.Si vous êtes à la rédaction de C++, je ne peux pas le recommander à l'aide de la Boost bibliothèques assez fortement.
La dernière version (1.55) inclut un nouveau Predef bibliothèque qui couvre exactement ce que vous cherchez, avec des dizaines d'autres plate-forme et l'architecture de la reconnaissance des macros.