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
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
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
.
Il compilatore di Visual C++ definisce le seguenti macro:
- _M_IX86 - per piattaforma x86
- _M_IA64 - piattaforma ia64
- _M_X64 - x64 piattaforma
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. –
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. –
Spiacente, prendo quello indietro - il compilatore definisce _WIN32 e _WIN64 e quelli specifici del processore. –
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.
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. –
"l'SDK di piattaforma Windows (o come lo chiamano quest'anno)" Come odio quella costante ridenominazione! +1 – sbi
@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'? –
- 1. C++ Compiler con CRTP
- 2. Si sta utilizzando la libreria Microsoft Enterprise?
- 3. Perché si può chiamare un costruttore di copia che passa nell'oggetto che si sta costruendo? (C++) (gcc)
- 4. TFS Build sta costruendo più configurazioni nonostante abbia scelto Release
- 5. Come verificare se UpdatePanel sta postando?
- 6. Tiny C Compiler (TCC) e Winsock?
- 7. Compilatore Microsoft Visual C++ per Python 3.4
- 8. Microsoft sta resettando Managed DirectX?
- 9. Per codice, come posso verificare se un disco rigido sta dormendo senza svegliarlo
- 10. Aggregazione e come verificare se è possibile sommare gli oggetti
- 11. Microsoft CCR sta ottenendo qualsiasi trazione?
- 12. È un modo corretto e portatile per verificare se 2 stringhe c si sovrappongono in memoria?
- 13. 64bit mirato Metro style app utilizzando C#
- 14. Verificare se Android WebView sta consumando eventi touch
- 15. Come sviluppare Microsoft addin word office per 64bit versione office in vs2010
- 16. Verificare se tastiera e mouse sono disponibili con Qt
- 17. Twitter-bootstrap: come verificare se il popover sta già mostrando?
- 18. Verificare se la funzione è dichiarata con il preprocessore C?
- 19. onCreate sempre chiamato se si sta tornando con intento
- 20. SQL Server - verificare se cast è possibile
- 21. Elm Compiler per sempre, il computer si scalda appena
- 22. Come verificare se AlertDialog.builder sta visualizzando e cancellato se viene visualizzato?
- 23. iOS: come verificare se UIViewControllers sta scaricando? (Swift)
- 24. Verificare se l'utente sta digitando nella finestra della console
- 25. Come verificare se smtp sta funzionando da commandline (Linux)
- 26. C++ .NET sta morendo?
- 27. Come utilizzare roslyn C# compiler con visual studio 2015?
- 28. File DLL per windows 7 64bit
- 29. È possibile utilizzare l'API Microsoft Lync per comunicare con Communicator 2007/2007 R2?
- 30. Come verificare se array vuoto in C
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
Scusate, volevo dire, le prestazioni nel mio caso particolare non sono importanti. – dreamlax