2010-04-02 7 views

Répondre

87

La prochaine fois que vous souhaitez extraire des macros prédéfinies prises en charge par GCC sur une plate-forme, exécutez le préprocesseur avec l'indicateur -dM. Il va lister toutes les macros prédéfinies disponibles sur le système. Par exemple:

$ touch dummy.hxx 
$ cpp -dM ./dummy.hxx 
#define __DBL_MIN_EXP__ (-1021) 
#define __FLT_MIN__ 1.17549435e-38F 
#define __CHAR_BIT__ 8 
#define __WCHAR_MAX__ 2147483647 
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324 
#define __FLT_EVAL_METHOD__ 0 
#define __DBL_MIN_10_EXP__ (-307) 
#define __FINITE_MATH_ONLY__ 0 
#define __SHRT_MAX__ 32767 
#define __LDBL_MAX__ 1.18973149535723176502e+4932L 
#define __UINTMAX_TYPE__ long unsigned int 
#define __linux 1 
#define __unix 1 
#define __linux__ 1 
... 
+1

+1 Cela fonctionne comme un charme! Comment je ne peux pas le savoir! Merci! – Viet

+1

@Viet: De rien ... en fait, j'ai rencontré une énigme similaire à la vôtre récemment. Je voulais savoir s'il y avait une macro prédéfinie indiquant l'ordre des octets de la machine. J'ai trouvé cela dans une documentation obscure après des heures et des heures de recherche! – themoondothshine

+38

cpp -dM/dev/null fonctionne également, aucun fichier supplémentaire n'est nécessaire. – Barry

11

Je serais plus enclin à tester la disponibilité des fonctionnalités que le nom de la plate-forme. Essayez d'utiliser autoconf.

Sinon, il s'agit de a comprehensive list of platform defines.

Également check out this page pour les définitions concernant les compilateurs, les bibliothèques, les architectures et les périphériques.

+1

Merci mais j'évite autoconf. Je veux juste utiliser des macros simples. – Viet

+1

+1 pour le lien "predef". – noamtm

+0

+1 pour le lien "predef". Il y a beaucoup plus définit un niveau supérieur dans le wiki. Laissez-moi améliorer votre réponse. – Mecki

4

J'utilise __MACH__ pour tester Mac OS X - ce n'est pas 100% unique à Mac OS X (il y a peut-être encore de vieilles boîtes NeXT!) Mais c'est suffisant pour faire la différence entre Mac et Linux.

+0

__APPLE__ couvre Mac OS X et iOS, donc c'est un meilleur pari que __MACH__ IMHO. C'est aussi plus commun de mon expérience –

+0

@ Hans-ChristophSteiner APPLE n'est pas défini sur OS X il semble. – lang2

+0

Je suppose que @Hans signifie '__APPLE__'? Mais même alors, je ne suis pas sûr que ce soit 100% fiable? –

8

Détectez OSX avec la macro __APPLE__ si vous le devez. Il est préférable d'utiliser configure pour détecter les fonctionnalités si vous le pouvez, mais tout ne fonctionne pas bien de cette façon.

+0

Oui, j'ai choisi cette façon dans mon code. J'ai juste Linux et Apple donc pas de problèmes. Merci. – Viet

+2

Je trouve très utile d'utiliser des macros définies par le compilateur comme '__APPLE__' parce que vous pouvez découpler le code du système de construction, la plupart du temps. Ensuite, il devient beaucoup plus facile de le porter sur des plateformes ésotériques comme Android ou Chrome NaCl, qui ne sont pas forcément sympas avec './Configure' et les amis –

+0

@ Hans-Christoph: Un bon environnement de compilation croisée devrait y aider. –

Questions connexes