도구
이 항목에서는 애플리케이션을 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용으로 빌드될 때 연결되지 않습니다.