2009-10-30 5 views
9

Esiste una semplice macro di preprocessore definita per una build a 64 bit? Ho pensato che _WIN64 avrebbe potuto esserlo, ma anche quando costruisco un target a 32 bit, le parti racchiuse in un #ifdef _WIN64 ... #endif sono compilate, e questo sta causando problemi. È venerdì e non riesco a pensare in modo diretto, ma sono sicuro che sto trascurando qualcosa di molto semplice qui. Forse anche qualcosa che coinvolge sizeof.E 'possibile verificare se si sta costruendo per 64-bit con Microsoft C Compiler?

risposta

18

Ho sempre usato _WIN64 per controllare se è una build a 64 bit.

N.B. _WIN32 è anche sempre (automaticamente) definito da MSVC a 64 bit si basa, in modo da controllare per _WIN64 prima di controllare per _WIN32:

#if defined(_WIN64) 

// Windows 64 bit code here 

#elif defined(_WIN32) 

// Windows 32 bit code here 

#else 

// Non-Windows code here 

#endif 
2

Controllare le proprietà di costruzione del progetto, in particolare la sezione del preprocessore. Stai definendo _WIN64 da qualche parte nei build WIN32? La cosa sizeof probabilmente non funzionerà poiché non è possibile utilizzare in un test #if.

+0

La cosa 'sizeof' non funziona per i comandi del preprocessore, ma un'istruzione' if' che ha una costante in fase di compilazione deve essere ottimizzata (ad esempio 'if (sizeof (long) == 4)'.Ricordo di averlo visto nell'implementazione di GNU di 'strlen'. Il codice viene eseguito solo una volta o due, quindi le prestazioni non sono importanti. – dreamlax

+0

Scusate, volevo dire, le prestazioni nel mio caso particolare non sono importanti. – dreamlax

8

Il compilatore di Visual C++ definisce le seguenti macro:

  • _M_IX86 - per piattaforma x86
  • _M_IA64 - piattaforma ia64
  • _M_X64 - x64 piattaforma
+4

Tuttavia, '_WIN64' /' WIN64'/'_WIN32' /' WIN32' dovrebbe essere usato quasi sempre se Windows è il target - la definizione che menzioni dovrebbe essere usata solo se hai davvero bisogno di gestire le differenze specifiche del processore (che dovrebbe essere raro) piuttosto che le differenze nella piattaforma del sistema operativo (che sono più comuni). Se '_WIN64' viene impostato in modo non corretto nei build a 32 bit, il problema dovrebbe essere risolto anziché spostato attorno. –

+0

La differenza è che _WIN64, ecc. Le macro sono definite dall'utente (o per te) nel progetto e le macro _M_X64, ecc. Sono definite dal compilatore. –

+0

Spiacente, prendo quello indietro - il compilatore definisce _WIN32 e _WIN64 e quelli specifici del processore. –

10

Sembra che il tuo problema potrebbe essere correlato a un colpo di testa o di un progetto impostazione definisce impropriamente _WIN64 - che dovrebbe essere lasciato al compilatore.

C'è una sottile differenza tra WIN64 e _WIN64 (almeno per i compilatori Microsoft - altri compilatori dovrebbero seguire l'esempio, ma non tutti lo fanno):

  • _WIN64 è definito dal compilatore quando è la costruzione di una programma per una piattaforma Windows 64-bit. Si noti che questo nome è nel namespace del implementor compilatore (underscore seguito da una lettera maiuscola)
  • WIN64 è definito dal di Windows Platform SDK (o come diavolo si chiamano in questo anno) quando il targeting una piattaforma a 64-bit .

Quindi, se siete tra cui solo le intestazioni standard e non adottare altre misure per definirlo, WIN64 sarà non essere definito.

C'è una storia simile per _WIN32 e WIN32 - ma controllare altri compilatori: GCC 3.4.5 definisce WIN32 anche se vengono utilizzate solo intestazioni standard. Come fa Digital Mars.

I compilatori di Microsoft e Comeau no.

Un altro bit di speranze (si spera) ben note è che _WIN32 e WIN32 vengono impostate per il targeting di piattaforme Windows a 64 bit. Troppe cose si sarebbero rotte altrimenti.

+0

Vedere http://stackoverflow.com/questions/662084/whats-the-difference-between-the-win32-and-win32-defines-in-c/662543#662543 per altre curiosità su nomi che differiscono solo da un leader sottolineare. –

+0

"l'SDK di piattaforma Windows (o come lo chiamano quest'anno)" Come odio quella costante ridenominazione! +1 – sbi

+0

@MichaelBurr Dove è definito 'WIN64'? Potresti (o qualcuno) indicare il posto esatto? Ho cercato su alcune versioni di Platform SDK e Visual Studio, ma non ho trovato alcun # #define WIN64! (È _utilizzato_ in un paio di punti, però, che quindi sembra sbagliato ...) Dovrebbe 'WIN64' essere abbandonato e sempre sostituito da' _WIN64'? –

Problemi correlati