Comment déterminer l'architecture de manière neutre la plate-forme?
Question
J'ai une application C ++ qui utilise wxWidgets. Certaines parties de l'application diffèrent pour les hôtes 32 et 64 bits. Actuellement, j'utilise sizeof (void *), mais est-il une meilleure façon qui utilise la compilation conditionnelle et la plate-forme neutre?
La solution
Généralement les gens utilisent #defines pour déterminer bitness (le define exact dépendra du compilateur). Cela vaut mieux qu'une approche d'exécution en utilisant sizeof (void *).
En ce qui concerne la plate-forme neutre, bien, certains compilateurs sont sur plusieurs plates-formes ..
Autres conseils
En fonction de votre compilateur vous pouvez avoir accès à la plate-forme de macros spécifiques. Essayez de regarder leur documentation.
Tous les compilateurs communes ont des macros prédéfinies préprocesseur qui identifient la plate-forme. Par exemple, si vous utilisez GCC, vous pouvez les consulter tous facilement:
touch foo.h; g++ -E -dM foo.h
ce qui donne entre autres
#define linux 1
#define __x86_64 1
pour moi, puisque je suis sur un linux 64b pour le moment, et
#define __APPLE__ 1
#define __i386 1
sur un 32b OS X, je l'entends.
Pour Sun Studio 12, ils sont documentés . En outre, Sun Microsystems les considère dans le cadre de l'API du compilateur si la compatibilité est assurée. Par exemple, sur ma boîte de Solaris, je __SunOS_5_10
et __sparcv9
défini (ce qui implique 64b).
Sur les systèmes AIX avec le compilateur xlc IBM, jetez un oeil à /etc/vac.cfg
et ses champs de mot-clé options
pour trouver les macros prédéfinies. Il y a au moins _AIX
et _AIX61
plus spécifique, ainsi que _POWER
(sur un PPC 64b) défini sur un système où j'ai accès.
Le HP-UX et son compilateur aCC, il y a au moins la macro __ia64
sur itanium. D'autres macros prédéfinies spécifiques sont documentées .
Quel est le problème avec l'utilisation sizeof()
où les questions de taille? Le compilateur optimisera heureusement il loin à une constante.