Strumenti
Questo argomento descrive gli strumenti da usare per rendere l'applicazione pronta a 64 bit. Windows 10 è disponibile per processori basati su X64 e ARM64.
File di inclusione
Gli elementi dell'API sono virtualmente identici tra Windows a 32 e a 64 bit. I file di intestazione di Windows sono stati modificati in modo che possano essere usati sia per codice a 32 che a 64 bit. I nuovi tipi e macro a 64 bit vengono definiti in un nuovo file di intestazione, Basetsd.h, che si trova nel set di file di intestazione inclusi in Windows.h. Basetsd.h include le nuove definizioni dei tipi di dati per facilitare l'indipendenza indipendente dalle dimensioni della parola del codice sorgente.
Nuovi tipi di dati
I file di intestazione di Windows contengono nuovi tipi di dati. Questi tipi sono principalmente per la compatibilità dei tipi con i tipi di dati a 32 bit. I nuovi tipi forniscono esattamente la stessa digitazione dei tipi esistenti, fornendo allo stesso tempo il supporto per Windows a 64 bit. Per altre informazioni, vedere Il nuovo tipo di dati o il file di intestazione Basetsd.h.
Macro predefinite
Il compilatore definisce le macro seguenti per identificare la piattaforma.
Macro | Significato |
---|---|
_WIN64 | Piattaforma a 64 bit. Ciò include sia x64 che ARM64. |
_WIN32 | Piattaforma a 32 bit. Questo valore è definito anche dal compilatore a 64 bit per la compatibilità con le versioni precedenti. |
_WIN16 | Piattaforma a 16 bit |
Le macro seguenti sono specifiche dell'architettura.
Macro | Significato |
---|---|
_M_IA64 | Piattaforma Intel Itanium |
_M_IX86 | Piattaforma x86 |
_M_X64 | Piattaforma x64 |
_M_ARM64 | Piattaforma ARM64 |
Non usare queste macro, ad eccezione del codice specifico dell'architettura, usare _WIN64, _WIN32 e _WIN16 ogni volta che possibile.
Funzioni di supporto
Le funzioni inline seguenti (definite in Basetsd.h) consentono di convertire in modo sicuro i valori da un tipo a un altro.
void * Handle64ToHandle( const void * POINTER_64 h )
void * POINTER_64 HandleToHandle64( const void *h )
long HandleToLong( const void *h )
unsigned long HandleToUlong( const void *h )
void * IntToPtr( const int i )
void * LongToHandle( const long h )
void * LongToPtr( const long l )
void * Ptr64ToPtr( const void * POINTER_64 p )
int PtrToInt( const void *p )
long PtrToLong( const void *p )
void * POINTER_64 PtrToPtr64( const void *p )
short PtrToShort( const void *p )
unsigned int PtrToUint( const void *p )
unsigned long PtrToUlong( const void *p )
unsigned short PtrToUshort( const void *p )
void * UIntToPtr( const unsigned int ui )
void * ULongToPtr( const unsigned long ul )
Avviso
IntToPtr sign-estende il valore int , UIntToPtr zero estende il valore int senza segno, il segno LongToPtr estende il valore lungo e ULongToPtr zero estende il valore lungo senza segno .
Compilatore a 64 bit
I compilatori a 64 bit possono essere usati per identificare il troncamento del puntatore, i cast di tipi non validi e altri problemi specifici a 64 bit.
Quando il compilatore viene eseguito per la prima volta, probabilmente genererà molti avvisi di troncamento del puntatore o di tipo non corrispondenti, ad esempio quanto segue:
warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '
Usare questi avvisi come guida per rendere il codice più affidabile. È consigliabile eliminare tutti gli avvisi, soprattutto gli avvisi di troncamento puntatore.
Opzioni e avvisi del compilatore a 64 bit
Si noti che questo compilatore abilita il modello di dati LLP64.
È disponibile un'opzione di avviso per facilitare la conversione in LLP64. L'opzione -Wp64 -W3 abilita gli avvisi seguenti:
- C4305: avviso di troncamento. Ad esempio, "return": troncamento da "unsigned int64" a "long".
- C4311: avviso di troncamento. Ad esempio, "type cast": troncamento puntatore da "int*_ptr64" a "int".
- C4312: conversione in avviso di dimensioni maggiori. Ad esempio, "type cast": conversione da "int" a "int*_ptr64" di dimensioni maggiori.
- C4318: passaggio della lunghezza zero. Ad esempio, passando costante zero come lunghezza alla funzione memset .
- C4319: non operatore. Ad esempio, "~": zero estendendo "unsigned long" a "unsigned _int64" di dimensioni maggiori.
- C4313: chiamata alla famiglia di funzioni printf con identificatori di tipo di conversione in conflitto e argomenti. Ad esempio, "printf": "%p" in conflitto con l'argomento 2 di tipo "_int64". Un altro esempio è il call printf("%x", pointer_value); ciò causa un troncamento dei 32 bit superiori. La chiamata corretta è printf("%p", pointer_value).
- C4244: uguale all'avviso esistente C4242. Ad esempio, "return": conversione da "_int64" a "unsigned int", possibile perdita di dati.
Linker e librerie a 64 bit
Per compilare applicazioni, usare il linker e le librerie fornite da Windows SDK. La maggior parte delle librerie a 32 bit ha una versione a 64 bit corrispondente, ma alcune librerie legacy sono disponibili solo in versioni a 32 bit. Il codice che chiama in queste librerie non verrà collegato quando l'applicazione viene compilata per Windows a 64 bit.