2008-09-30 16 views
61

Quelle est la méthode la plus fiable pour déterminer l'architecture de la CPU lors de la compilation de code C ou C++? Autant que je sache, différents compilateurs ont leur propre ensemble de définitions de préprocesseur non standard (_M_X86 dans MSVS, __i386__, __arm__ dans GCC, etc.).Détection de l'architecture de la CPU à la compilation

Existe-t-il un standard pour détecter l'architecture que je suis en train de construire? Si non, existe-t-il une source pour une liste complète de ces définitions pour divers compilateurs, comme un en-tête avec toutes les informations #ifdef s?

+0

Fondamentalement, le même réponse pour la détection OS: http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive –

Répondre

60

Voici quelques informations sur Pre-defined Architecture Macros et d'autres types de macros prédéfinies.

+0

La norme C ou C++ définit-elle des macros suggestives à utiliser par différents compilateurs. –

+0

Cela semble correct, mais quelqu'un peut citer le document GCC qui dit qu'il l'utilise? –

3

Il n'y a rien de standard. Brian Hook en a documenté un tas dans son "Portable Open Source Harness", et essaie même d'en faire quelque chose de cohérent et d'utilisable (ymmv à ce sujet). Voir l'en-tête de posh.h sur ce site:

Notez le lien ci-dessus peut vous obliger à entrer un code d'utilisateur/mot de passe faux en raison d'une attaque DOS il y a quelque temps.

+5

-1, Boo aux liens qui nécessitent des mots de passe. – paxos1977

+2

Jeez - désolé pour le lien faux - il devrait être à http://hookatooka.com/poshlib/ qui donne des informations sur l'ID utilisateur/mot de passe. Mon navigateur doit être connecté automatiquement à partir d'une visite précédente sur la page. –

+0

Beau lien! :) ..... –

14

Il n'y a pas de standard inter-compilateur, mais chaque compilateur a tendance à être assez cohérent. Vous pouvez construire un en-tête pour vous-même qui est quelque chose comme ceci:

#if MSVC 
#ifdef _M_X86 
#define ARCH_X86 
#endif 
#endif 

#if GCC 
#ifdef __i386__ 
#define ARCH_X86 
#endif 
#endif 

Il n'y a pas beaucoup d'intérêt à une liste exhaustive, car il y a des milliers de compilateurs, mais seulement 3-4 largement utilisés (Microsoft C++, GCC, Intel CC , peut-être TenDRA?). Décidez simplement quels compilateurs votre application supportera, listez leurs #defines, et mettez à jour votre en-tête si nécessaire.

+2

Cela ne fonctionnait pas pour moi sur Visual Studio 2010. '_M_X86' était positivement non défini (build 32 bits). La bonne est '_M_IX86' (crédit au lien de Serge ci-dessus). – Thomas

-2

Si vous avez besoin d'une détection fine des fonctionnalités du processeur, la meilleure approche consiste à envoyer également un programme CPUID qui délivre à stdout ou un fichier "cpu_config.h" l'ensemble des fonctionnalités supportées par la CPU. Ensuite, vous intégrez ce programme avec votre processus de construction.

+2

Ne fonctionnera pas pour la compilation croisée.Et comment compiler un programme cpuid à moins de savoir sur quelle machine il doit fonctionner? – jforberg

3

Si vous souhaitez vider toutes les fonctionnalités disponibles sur une plate-forme particulière, vous pouvez exécuter GCC comme:

gcc -march=native -dM -E - </dev/null

Il dépotoirs Marcos comme #define __SSE3__ 1, #define __AES__ 1, etc.

+0

'-march = native' échoue pour ARM et MIPS pour GCC 4.9 et ci-dessous. – jww