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.