10
votes

Est-il possible de vérifier si vous construisez 64 bits avec le compilateur Microsoft C?

existe-t-il une macro de préprocesseur simple défini pour une construction 64 bits? Je pensais que _win64 aurait pu être, mais même lorsque je construis une cible 32 bits, les pièces ci-jointes dans un #Ifdef _win64 ... #endif sont compilés dans, Et cela cause des problèmes. C'est vendredi et je ne peux pas penser tout droit, mais je suis sûr que je suis négligeant quelque chose de très simple ici. Peut-être même quelque chose impliquant sizeof .


0 commentaires

4 Réponses :


2
votes

Vérifiez que les propriétés de construction de votre projet, en particulier la section Précrocesseur. Vous définissez _win64 quelque part dans win32 construit? Le Tailleof est probablement ne fonctionnera probablement pas depuis que vous ne pouvez pas utiliser dans un #if test.


2 commentaires

Le Tailleof ne fonctionnera pas pour les commandes de préprocesseur, mais une instruction si si une constante de temps compilée doit être optimisée (c'est-à-dire si (taille de ) == 4) . Je me souviens de voir cela dans la mise en œuvre de GNU de Strlen . Le code n'exécute qu'une seule ou deux fois, la performance n'est pas importante.


Désolé, je voulais dire que la performance dans mon cas particulier n'est pas importante.



8
votes

Le compilateur Visual C ++ définit les macros suivantes:

  • _M_IX86 - X86 Plateforme
  • _M_IA64 - Plateforme IA64
  • _M_X64 - X64 Platform

4 commentaires

Cependant, _win64 / win64 / _win32 / win32 devrait presque toujours être utilisé à la place si Windows est la cible - la Définit que vous avez mentionné ne doit être utilisée que si vous avez vraiment besoin de traiter des différences spécifiques au processeur (qui devraient être rares) plutôt que des différences dans la plate-forme OS (qui sont plus courantes). Si _win64 est incorrectement défini dans des bandes 32 bits, le problème doit être fixé plutôt que sur une cuvette.


La différence est que _win64, etc. Les macros sont définis par vous (ou pour vous) dans votre projet et les macros _M_X64, etc. Les macros sont définis par le compilateur.


Désolé, je prends ce dos - compilateur définit _win32 et _win64 ainsi que les processeurs spécifiques.


Ces macros sont utiles lorsque vous souhaitez différencier les différentes plates-formes de 64 bits tels que Itanium et AMD64 (peut-être même bras à l'avenir), que vous ne pouvez pas faire avec juste _win64. Mais l'inconvénient est que ces macros définies par compilateur ne sont pas disponibles à partir de fichiers RC (ressources), compilées à l'aide du compilateur de ressources.



19
votes

J'ai toujours utilisé _Win64 pour vérifier s'il s'agit d'une construction 64 bits.

n.b. _Win32 est également toujours défini (automatiquement) défini par MSVC dans des générations 64 bits, alors vérifiez pour vérifier _win32: xxx


0 commentaires

10
votes

On dirait que votre problème peut être associé à un en-tête ou à un paramètre de projet définissant de manière incorrecte _win64 - qui doit être laissé au compilateur.

Il y a une différence subtile entre win64 et _win64 (au moins pour les compilateurs Microsoft - autres compilateurs devraient suivre la poursuite, mais pas tous les):

  • _win64 est défini par le compilateur quand il construit un programme pour une plate-forme Windows 64 bits. Notez que ce nom est dans l'espace de noms du compilateur de la mise en œuvre (signal de soulignement principal suivi d'une lettre majuscule)
  • win64 est défini par le la plate-forme Windows SDK (ou quoi que ce soit d'appelant cette année) lors de la ciblage d'une plate-forme 64 bits.

    Donc, si vous comprenez seulement des en-têtes standard et ne prenez pas d'autres mesures pour la définir, win64 pas est défini.

    Il y a une histoire similaire pour _win32 et win32 - mais vérifiant les autres compilateurs: GCC 3.4.5 définit win32 même si seuls les en-têtes standard sont utilisés. Comme le Digital Mars.

    Les compilateurs et Comeau de Microsoft ne le font pas.

    Un autre bit de (espérons-le) une trivia bien connue est que _win32 et win32 est défini lors de la ciblage des plates-formes Windows 64 bits. Trop de choses auraient cassé autrement.


3 commentaires

Voir Stackoverflow.com/Questtions/662084/... pour d'autres trivia sur des noms qui ne diffèrent que par un seul soulignement.


"Le SDK de la plate-forme Windows (ou quoi que ce soit l'appelant cette année)" Comment je déteste ce changement de renommage constant! +1


@Michaelburr où est win64 défini? Pourriez-vous (ou quiconque) signaler l'endroit exact? Je l'ai cherché à travers certaines versions de plate-forme SDKS et Visual Studio, mais je n'ai trouvé aucun #define win64 du tout! (C'est utilisé dans quelques endroits, cependant, ce qui semble donc erroné ...) Si Win64 être abandonné et toujours remplacé par _win64 ?