Udostępnij przez


Narzędzia

W tym temacie opisano narzędzia dostępne do przygotowania Twojej aplikacji do wersji 64-bitowej. System Windows 10 jest dostępny dla procesorów opartych na architekturze x64 i ARM64.

Dołączanie plików

Elementy interfejsu API są praktycznie identyczne między 32- i 64-bitowymi systemami Windows. Pliki nagłówków systemu Windows zostały zmodyfikowane, aby mogły być używane zarówno dla kodu 32-, jak i 64-bitowego. Nowe typy i makra 64-bitowe są definiowane w nowym pliku nagłówkowym Basetsd.h, który znajduje się w zestawie plików nagłówków dołączonych do systemu Windows.h. Plik Basetsd.h zawiera nowe definicje typu danych, które ułatwiają tworzenie niezależnego rozmiaru wyrazu kodu źródłowego.

Nowe typy danych

Pliki nagłówkowe systemu Windows zawierają nowe typy danych. Te typy są przeznaczone głównie do zgodności typów z 32-bitowymi typami danych. Nowe typy zapewniają dokładnie takie samo wpisywanie jak istniejące typy, jednocześnie zapewniając obsługę 64-bitowego systemu Windows. Aby uzyskać więcej informacji, zobacz Nowe typy danych lub plik nagłówka Basetsd.h.

Wstępnie zdefiniowane makra

Kompilator definiuje następujące makra, aby zidentyfikować platformę.

Makro Znaczenie
_WIN64 64-bitowa platforma. Obejmuje to zarówno x64, jak i ARM64.
_WIN32 Platforma 32-bitowa. Ta wartość jest również definiowana przez kompilator 64-bitowy na potrzeby zgodności z poprzednimi wersjami.
_WIN16 16-bitowa platforma

Następujące makra są specyficzne dla architektury.

Makro Znaczenie
_M_IA64 Platforma Intel Itanium
_M_IX86 Platforma x86
_M_X64 Platforma x64
_M_ARM64 Platforma ARM64

Nie używaj tych makr z wyjątkiem kodu specyficznego dla architektury, zamiast tego należy używać _WIN64, _WIN32 i _WIN16 zawsze, gdy jest to możliwe.

Funkcje pomocnika

Następujące funkcje wbudowane (zdefiniowane w pliku Basetsd.h) mogą ułatwić bezpieczne konwertowanie wartości z jednego typu na inny.

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 )

Ostrzeżenie

IntToPtr znak rozszerza wartość int, UIntToPtr zero-rozszerza wartość unsigned int, LongToPtr znak rozszerza wartość long, a ULongToPtr zero-rozszerza wartość unsigned long.

64-bitowy kompilator

64-bitowe kompilatory mogą służyć do identyfikowania skracania wskaźników, nieprawidłowego rzutowania typów i innych problemów specyficznych dla platformy 64-bitowej.

Podczas pierwszego uruchomienia kompilatora prawdopodobnie wygeneruje wiele ostrzeżeń dotyczących obcinania wskaźnika lub niezgodności typów, takich jak następujące:

warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '

Użyj tych ostrzeżeń jako przewodnika, aby kod był bardziej niezawodny. Dobrym rozwiązaniem jest wyeliminowanie wszystkich ostrzeżeń, zwłaszcza ostrzeżeń o obcięciu wskaźnika.

64-bitowe przełączniki i ostrzeżenia kompilatora

Należy pamiętać, że ten kompilator włącza model danych LLP64.

Istnieje opcja ostrzegawcza ułatwiająca przenoszenie na LLP64. Przełącznik -Wp64 -W3 włącza następujące ostrzeżenia:

  • C4305: Ostrzeżenie o obcięciu. Na przykład "return": konwersja z "bez znaku int64" do "long".
  • C4311: Ostrzeżenie o obcięciu. Na przykład "type cast": obcinanie wskaźnika z "int*_ptr64" do "int".
  • C4312: Konwersja na ostrzeżenie o rozmiarze większym. Na przykład "rzutowanie typu": konwersja z "int" na "int*_ptr64" o większym rozmiarze.
  • C4318: Przekazywanie wartości o zerowej długości. Na przykład przekazanie wartości stałej zero jako argumentu określającego długość do funkcji memset.
  • C4319: Nie operator. Na przykład "~": rozszerzenie zera "unsigned long" na "unsigned _int64" o większym rozmiarze.
  • C4313: Wywoływanie rodziny funkcji printf ze specyfikatorami typów konwersji i argumentami powodującymi konflikty. Na przykład "printf": "%p" w przypadku konfliktów ciągu formatu z argumentem 2 typu "_int64". Innym przykładem jest wywołanie printf("%x", pointer_value); Powoduje to obcięcie górnych 32 bitów. Poprawne wywołanie to printf("%p", pointer_value).
  • C4244: takie samo jak istniejące ostrzeżenie C4242. Na przykład "return": konwersja z "_int64" na "niepodpisane int", możliwa utrata danych.

64-bitowy linker i biblioteki

Aby tworzyć aplikacje, użyj konsolidatora i bibliotek udostępnianych przez zestaw Windows SDK. Większość bibliotek 32-bitowych ma odpowiednią 64-bitową wersję, ale niektóre starsze biblioteki są dostępne tylko w wersjach 32-bitowych. Kod wywołujący te biblioteki nie będzie łączyć się, gdy aplikacja jest kompilowana dla 64-bitowego systemu Windows.