2010-09-06 4 views

Répondre

4

Si vous êtes préoccupé par Linux OS seulement alors vous pouvez utiliser l'appel uname(). Vous pouvez passer struct utsname à cette API et obtenir les détails. Vous pouvez obtenir des détails supplémentaires sur l'URL suivante

http://linux.die.net/man/2/uname

examine également la code source de commande uname peut vous aider davantage à ce sujet.

-2

Cela devrait fonctionner:

#include <iostream> 
int main(int argc, char ** arv){ 
    std::cout << "sizeof(void*)=" << sizeof(void*) << std::endl; 
    return 0; 
} 
+0

Voir mon commenter la réponse de HPT. –

+4

En outre, ce n'est pas C. – domen

1

En tant que « détail de mise en œuvre » c'est exactement le genre de chose qui reste de la spécification formelle pour le langage C; étant donné que le compilateur est censé théoriquement vous cacher cela, tout ce que vous pourriez faire pour comprendre cette information dépend techniquement d'un "comportement non standard non défini".

Voilà la réponse pédante. La réponse pratique est que vous pouvez utiliser sizeof(int) pour déterminer la largeur du registre sur votre architecture particulière avec n'importe quel compilateur sensible.

Notez que ceci est déterminé au moment de la compilation, pas le temps d'exécution, il vous indique si votre application a été compilé en mode 32 bits ou 64 bits (ou tout bits), pas que ce soit être par exemple exécuté sur une machine 64 bits émulant 32 bits x86. Pour ce genre d'information, vous devez regarder des choses totalement spécifiques à la plate-forme comme CPUID.

+0

N'utilisez pas 'sizeof (int)' pour cela. Il ne vous donnera pas (en pratique) la bonne réponse. A la place, 'sizeof (size_t)', 'sizeof (ptrdiff_t)', ou 'sizeof (char *)' serait un bon choix. (Sur toute machine saine, ils seront tous les mêmes ..) –

+0

sizeof (char *) ne fonctionnera pas sur les plates-formes avec des tailles de pointeurs variables (par exemple x86 en mode réel avec le non-sens proche/loin/énorme pointeur). size_t le fera probablement. Quels compilateurs ont un type 'int' qui n'a pas la largeur du registre? – Crashworks

0

Le compilateur doit savoir à moment de la compilation quelle architecture il est construit pour, donc il ne devrait pas être nécessaire de déterminer cela à exécution.

Un compilateur aura typiquement une macro prédéfinie indiquant l'architecture; vous devrez tester toutes les architectures que vous avez l'intention de construire. Une liste de ces macros pour diverses architectures est fournie à http://predef.sourceforge.net/prearch.html

+0

Alors, que faire si vous exécutez un programme 32 bits sur un système 64 bits? – atzz

+1

En ce qui concerne le programme 32 bits, il fonctionne sur un système 32 bits. Il ne peut utiliser aucune fonctionnalité 64 bits dans sa propre adresse/espace de traitement. La seule raison pour laquelle je pourrais penser qu'il pourrait être utile de savoir si c'est sur un système d'exploitation hôte 32 bits ou 64 bits est de décider quelle version d'un programme externe pour télécharger et installer. –

+0

@atzz: Le programme pense qu'il s'exécute sur une machine 32 bits, donc tout test que vous concevez retournera 32bit. Le programme sera exécuté dans le sous-système 32 bits du système d'exploitation qui sera une machine virtuelle. – Clifford

0

Il existe plusieurs couches ici compilateur - OS - Processeur. Obtention de l'arche de la machine à partir d'un programme utilisateur C n'est pas conseillé car vous n'avez pas assez d'informations et n'est pas portable.

Cependant, si tu veux savoir pour OS comme Linux spécifique est ici le link

Vous pouvez utiliser l'aide des outils ci-dessus dans votre programme.

0

Vous pouvez utiliser préprocesseur:

#ifdef __i386__ 
    blahblah 
#elif __arm__ 
    blahblah 
#elif defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64) 
    blahblah 
#endif 
Questions connexes