41 votes

Des macros pour GCC/G++ pour différencier Linux et Mac OSX ?

Des macros pour GCC/G++ pour différencier Linux et Mac OSX ?

0 votes

94voto

themoondothshine Points 1430

La prochaine fois que vous voudrez vérifier les macros prédéfinies prises en charge par GCC sur une plate-forme, exécutez le préprocesseur avec l'indicateur -dM . La liste de toutes les macros prédéfinies disponibles sur le système sera affichée. 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 votes

@Viet : De rien... En fait, j'ai rencontré un problème similaire au vôtre récemment. Je voulais savoir s'il existait une macro prédéfinie indiquant l'ordre des octets de la machine. Je suis tombé sur cette information dans une documentation obscure après des heures et des heures de recherche !

9 votes

Pour GCC sur OS X, vous pouvez utiliser echo | g++ -dM -E -

0 votes

J'aime ce genre de réponse. Ça répond à tout.

12voto

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

Sinon, c'est une liste complète des définitions de la plate-forme .

Aussi consultez cette page pour les définitions concernant les compilateurs, les bibliothèques, les architectures et les dispositifs.

1 votes

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

0 votes

+1 pour le lien "predef". Il y a beaucoup plus de définitions un niveau plus haut dans le wiki. Laissez-moi améliorer votre réponse.

9voto

Donal Fellows Points 56559

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

0 votes

Oui, j'ai choisi cette voie dans mon code. Je n'ai que Linux et Apple, donc pas de problème. Merci.

2 votes

Je trouve que l'utilisation de macros définies par le compilateur comme __APPLE__ très utile parce que vous pouvez découpler le code du système de construction, la plupart du temps. Cela rend ensuite votre tâche beaucoup plus facile lors du portage sur des plateformes ésotériques comme Android ou Chrome NaCl, qui ne sont pas nécessairement compatibles avec le système de construction. ./configure et amis

0 votes

Hans-Christophe : Un bon environnement de compilation croisée devrait y contribuer.

4voto

Paul R Points 104036

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

1 votes

APPLE couvre Mac OS X et iOS, c'est donc un meilleur choix que MACH IMHO. D'après mon expérience, c'est aussi plus fréquent.

0 votes

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

0 votes

Je suppose que @Hans veut dire __APPLE__ ? Mais même dans ce cas, je ne suis pas sûr que ce soit fiable à 100% ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X