다음을 통해 공유


도구

이 항목에서는 애플리케이션을 64비트 준비 상태로 만드는 데 사용할 수 있는 도구에 대해 설명합니다. Windows 10 x64 및 ARM64 기반 프로세서 모두에 사용할 수 있습니다.

포함 파일

API 요소는 32비트와 64비트 Windows 간에 거의 동일합니다. Windows 헤더 파일은 32비트 및 64비트 코드 모두에 사용할 수 있도록 수정되었습니다. 새 64비트 형식 및 매크로는 Windows.h에 포함된 헤더 파일 집합에 있는 새 헤더 파일 Basetsd.h에 정의됩니다. Basetsd.h에는 소스 코드 단어 크기를 독립적으로 만드는 데 도움이 될 수 있는 새로운 데이터 형식 정의가 포함되어 있습니다.

새 데이터 형식

Windows 헤더 파일에는 새 데이터 형식이 포함됩니다. 이러한 형식은 주로 32비트 데이터 형식과의 형식 호환성을 위한 것입니다. 새 형식은 기존 형식과 정확히 동일한 입력을 제공하는 동시에 64비트 Windows를 지원합니다. 자세한 내용은 새 데이터 형식 또는 Basetsd.h 헤더 파일을 참조하세요.

미리 정의된 매크로

컴파일러는 플랫폼을 식별하기 위해 다음 매크로를 정의합니다.

매크로 의미
_WIN64 64비트 플랫폼. 여기에는 x64 및 ARM64가 모두 포함됩니다.
_WIN32 32비트 플랫폼. 이 값은 이전 버전과의 호환성을 위해 64비트 컴파일러에서도 정의됩니다.
_WIN16 16비트 플랫폼

다음 매크로는 아키텍처와 관련이 있습니다.

매크로 의미
_M_IA64 Intel Itanium 플랫폼
_M_IX86 x86 플랫폼
_M_X64 x64 플랫폼
_M_ARM64 ARM64 플랫폼

아키텍처별 코드를 제외하고 이러한 매크로를 사용하지 말고 가능하면 _WIN64, _WIN32 및 _WIN16 사용합니다.

도우미 함수

다음 인라인 함수(Basetsd.h에 정의됨)는 값을 한 형식에서 다른 형식으로 안전하게 변환하는 데 도움이 될 수 있습니다.

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 )

경고

IntToPtr sign-extends the int value, UIntToPtr zero-extends the unsigned int value, LongToPtr sign-extends the long value, ULongToPtr zero-extends the unsigned long value.

64비트 컴파일러

64비트 컴파일러를 사용하여 포인터 잘림, 부적절한 형식 캐스트 및 기타 64비트 관련 문제를 식별할 수 있습니다.

컴파일러가 처음 실행되면 다음과 같이 많은 포인터 잘림 또는 형식 불일치 경고가 생성될 수 있습니다.

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

이러한 경고를 지침으로 사용하여 코드를 보다 강력하게 만듭니다. 모든 경고, 특히 포인터 잘림 경고를 제거하는 것이 좋습니다.

64비트 컴파일러 스위치 및 경고

이 컴파일러는 LLP64 데이터 모델을 사용하도록 설정합니다.

LLP64로 이식하는 데 도움이 되는 경고 옵션이 있습니다. -Wp64 -W3 스위치는 다음 경고를 사용하도록 설정합니다.

  • C4305: 잘림 경고입니다. 예를 들어 "return": "unsigned int64"에서 "long"으로 잘립니다.
  • C4311: 잘림 경고입니다. 예를 들어 "type cast": 포인터 잘림을 "int*_ptr64"에서 "int"로 잘립니다.
  • C4312: 더 큰 크기 경고로 변환합니다. 예를 들어 "type cast": 더 큰 크기의 "int"에서 "int*_ptr64"로 변환합니다.
  • C4318: 길이 0을 전달합니다. 예를 들어 상수 0을 memset 함수에 길이로 전달합니다.
  • C4319: 연산자가 아닙니다. 예를 들어 "~": "unsigned long"을 더 큰 크기의 "서명되지 않은 _int64"로 확장하는 0입니다.
  • C4313: 변환 형식 지정자 및 인수가 충돌하는 함수의 printf 패밀리를 호출합니다. 예를 들어 형식 문자열의 "printf": "%p"는 "_int64" 형식의 인수 2와 충돌합니다. 또 다른 예로는 printf("%x", pointer_value);라는 호출이 있습니다. 이로 인해 상위 32비트 잘림이 발생합니다. 올바른 호출은 printf("%p", pointer_value)입니다.
  • C4244: 기존 경고 C4242와 동일합니다. 예를 들어 "return": "_int64"에서 "서명되지 않은 int"로 변환하면 데이터가 손실될 수 있습니다.

64비트 링커 및 라이브러리

애플리케이션을 빌드하려면 Windows SDK에서 제공하는 링커 및 라이브러리를 사용합니다. 대부분의 32비트 라이브러리에는 해당 64비트 버전이 있지만 특정 레거시 라이브러리는 32비트 버전에서만 사용할 수 있습니다. 이러한 라이브러리를 호출하는 코드는 애플리케이션이 64비트 Windows용으로 빌드될 때 연결되지 않습니다.