Qui De La Croix-Plate-Forme De Préprocesseur? (__WIN32__ ou __WIN32 ou WIN32 )?
Je vois souvent des __WIN32
, WIN32
ou __WIN32__
. Je suppose que cela dépend du préprocesseur (un à partir de visual studio, ou gcc, etc).
Faire maintenant, je dois d'abord vérifier pour les os et puis pour le compilateur utilisé? Nous sommes ici à l'aide de G++ 4.4.x, Visual Studio 2008 et Xcode (qui je suppose est un ccg) et de l'ATM, nous sommes juste en utilisant la __WIN32__
, __APPLE__
et __LINUX__
.
_WIN32
est systématique, plus offen que d'autres orthographes. Voir sourceforge.net/p/predef/wiki/OperatingSystems . La bonne pratique est de tester ce qui est pertinent dans chaque situation (OS, archi, compilateur,...) et de ne pas tester l'un pour l'autre. Et aussi de ne pas redéfinir votre propre.
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que vous essayez de faire. Vous pouvez vérifier le compilateur si votre programme veut faire usage de certaines fonctions (à partir de la chaîne de compilation gcc par exemple). Vous pouvez vérifier le système d'exploitation ( _WINDOWS, __unix__ ) si vous souhaitez utiliser certains OS des fonctions spécifiques (quel que soit le compilateur par exemple CreateProcess sur Windows et la fourche sur unix).
Les Macros Visual C
Macros pour gcc
Vous devez vérifier la documentation de chaque compilateur afin d'être en mesure de détecter les différences lors de la compilation. Je me souviens que la chaîne d'outils gnu(gcc) a certaines fonctions de la bibliothèque C (libc) qui ne sont pas sur d'autres toolchains (comme Visual C par exemple). De cette façon, si vous voulez utiliser ces fonctions de base que vous devez détecter que vous utilisez GCC, donc le code que vous devez utiliser sont les suivantes:
Cet article répond à votre question:
L'article est assez long, et comprend des tableaux qui sont difficiles à reproduire, mais voici l'essentiel:
Vous pouvez détecter de style Unix, OS avec:
Une fois que vous savez que c'est Unix, vous pouvez trouver si c'est la norme POSIX et la version POSIX avec:
Vous pouvez vérifier les systèmes dérivés BSD avec:
et Linux avec:
et Apple systèmes d'exploitation avec
Windows avec Cygwin
Et non-POSIX Windows avec:
L'intégralité de l'article répertorie les symboles suivants et indique les systèmes de définir et quand:
_AIX
,__APPLE__
,__CYGWIN32__
,__CYGWIN__
,__DragonFly__
,__FreeBSD__
,__gnu_linux
,hpux
,__hpux
,linux
,__linux
,__linux__
,__MACH__
,__MINGW32__
,__MINGW64__
,__NetBSD__
,__OpenBSD__
,_POSIX_IPV6
,_POSIX_MAPPED_FILES
,_POSIX_SEMAPHORES
,_POSIX_THREADS
,_POSIX_VERSION
,sun
,__sun
,__SunOS
,__sun__
,__SVR4
,__svr4__
,TARGET_IPHONE_SIMULATOR
,TARGET_OS_EMBEDDED
,TARGET_OS_IPHONE
,TARGET_OS_MAC
,UNIX
,unix
,__unix
,__unix__
,WIN32
,_WIN32
,__WIN32
,__WIN32__
,WIN64
,_WIN64
,__WIN64
,__WIN64__
,WINNT
,__WINNT
,__WINNT__
.Un article connexe (archive.org lien) couvre la détection des compilateurs et des versions de compilateur. Il répertorie les symboles suivants:
__clang__
,__GNUC__
,__GNUG__
,__HP_aCC
,__HP_cc
,__IBMCPP__
,__IBMC__
,__ICC
,__INTEL_COMPILER
,_MSC_VER
,__PGI
,__SUNPRO_C
,__SUNPRO_CC
pour la détection des compilateurs, et__clang_major__
,__clang_minor__
,__clang_patchlevel__
,__clang_version__
,__GNUC_MINOR__
,__GNUC_PATCHLEVEL__
,__GNUC__
,__GNUG__
,__HP_aCC
,__HP_cc
,__IBMCPP__
,__IBMC__
,__ICC
,__INTEL_COMPILER
,__INTEL_COMPILER_BUILD_DATE
,_MSC_BUILD
,_MSC_FULL_VER
,_MSC_VER
,__PGIC_MINOR__
,__PGIC_PATCHLEVEL__
,__PGIC__
,__SUNPRO_C
,__SUNPRO_CC
,__VERSION__
,__xlC_ver__
,__xlC__
,__xlc__
pour la détection des versions de compilateur.Ne vois pas pourquoi vous devez. Vous pourriez avoir à n'oubliez pas de préciser la définition manuellement sur votre compilateur de ligne de commande, mais c'est tout. Pour l'enregistrement, Visual Studio définition est
_WIN32
(avec un trait de soulignement) plutôt que de__WIN32
. Si ce n'est pas définie, alors il n'est pas défini et il ne sera pas question.#ifdef __WIN32__
seule fois et non pas#ifdef WIN32 || __WIN32 || __WIN32__
_WIN32
est définie pour tous (moderne) des compilateurs pour Windows (à l'exclusion de la Crispation bien sûr). Pas besoin de le définir vous-même...#ifdef
-l'expression est fausse. Il devrait être#if defined(WIN32) || defined(__WIN32) || defined(__WIN32__)
. Voir C les directives de Préprocesseur et les opérateurs booléens de référence.#if WIN32 || _WIN32 || __WIN32__
. Undefined noms sont traités comme zéro. La question est de savoir ce qui doit être fait en cas de#define _WIN32 0
.#if
-l'expression est inappropriée. Si vous voulez vérifier si un symbole de préprocesseur est défini, il est préférable de vérifier si un symbole de préprocesseur est défini.#define _WIN32 0
le même que#define _WIN32 1
, plutôt que de#undef _WIN32
?J'ai reconstruire ma réponse... Merde, édition berserk :P:
Vous n'avez pas besoin d'utiliser partical un. Et probablement pour MacOSX, Linux et autres Unix-aime vous n'avez pas besoin d'utiliser du tout.
Plus populaire est (autant que Google dit la vérité) est
_WIN32
.Vous jamais définir "à la main" dans votre code source. Il est défini dans l'une de ces façons:
comme une ligne de commande préprocesseur/compilateur drapeau (comme
g++ -D _WIN32
)ou il est prédéfini par le compilateur lui-même (la plupart des compilateurs pour Windows prédéfinir
_WIN32
, et parfois d'autres commeWIN32
ou_WIN32_
trop. - Alors vous n'avez pas besoin de s'inquiéter à propos de la définition, à tous, compilateur ne l'ensemble des travaux.Et mon ancienne réponse:
Vous ne pas "avoir à" quoi que ce soit. C'est juste pour le multi-compatibilité de plate-forme. Souvent, la version de code pour tous les Unix-aime (y compris Linux, Mac, BSD, Solaris...) et d'autres POSIX plate-forme sera tout à fait la même et il doit y avoir quelques changements pour Windows. Donc les gens à écrire leur code, en général, pour Unix aime et de mettre Windows uniquement (par exemple. DirectX instructions, les Fenêtres, les chemins de fichiers...) les pièces entre
#ifdef _WIN32
et#endif
.Si vous avez quelques pièces, par exemple. X-Window-system uniquement, ou MacOS-seulement, vous n'avez semblable à quelque chose comme
#ifdef X_WINDOW
ou#ifdef MACOS
. Ensuite, vous devez définir une bonne définition de préprocesseur lors de la compilation (gcc à l'aide de drapeau-D, comme par exemple.gcc -D _WIN32
).Si vous n'écrivez pas tout dépend de la plateforme, code, alors vous n'avez pas besoin de soins pour un
#ifdef, #else, #endif
blocs. Et la plupart des compilateurs pour Windows/préprocesseurs autant que je sache prédéfinies et certains symboles comme_WIN32
(le plus populaire, aussi loin que google dit la vérité),WIN32
,_WIN32_
, etc. Donc le compiler sous Windows, plus probablement, vous n'avez pas besoin de faire autre chose que juste de la compilation.#ifdef
. Et je me demandais pourquoi il ya tellement de nombreuses variantes et si il y en a un qui devrait fonctionner avec la plupart des compiliers.Soupir - ne comptez pas sur le compilateur n'importe quoi - spécifier la plate-forme de construction de dans votre Makefile. Tout simplement, quelque chose commençant par _ est dépendant de l'implémentation et de ne pas portable.
J'ai essayé votre méthode une fois, sur un très gros projet, et entre rebondir entre Soleil-C++ et GCC nous avons juste décidé d'aller avec le Makefile de contrôle, plutôt que d'essayer d'en déduire ce que les compilateurs allaient faire.