C ++에서 64bits 아키텍처를 컴파일하는 경우 어떻게 감지 할 수 있습니까?
-
03-07-2019 - |
문제
C ++ 기능에서는 64 비트 아키텍처를 위해 컴파일하는 경우 다른 블록을 선택하려면 컴파일러가 필요합니다.
MSVC ++ 및 G ++를 위해 수행하는 방법을 알고 있으므로 답으로 게시하겠습니다. 그러나 더 나은 방법이 있는지 알고 싶습니다 (모든 컴파일러/64 비트 아키텍처에서 더 우아함). 더 나은 방법이 없다면 다른 컴파일러/아키텍처와 호환되기 위해 어떤 사전 정의 된 매크로를 찾아야합니까?
해결책
왜 다른 블록보다 한 블록을 선택합니까? 귀하의 결정이 포인터의 크기를 기준으로하는 경우 사용하십시오. sizeof(void*) == 8
. 귀하의 결정이 정수의 크기를 기준으로하는 경우 사용하십시오. sizeof(int) == 8
.
내 요점은 아키텍처 자체의 이름이 거의 차이를 만들지 않아야한다는 것입니다. 당신은 당신이 할 일의 목적으로 당신이 확인해야 할 것만 확인합니다. 귀하의 질문은 수표의 목적이 무엇인지 명확하게 다루지 않습니다. 당신이 요구하는 것은 Windows 버전을 쿼리하여 DirectX가 설치되는지 확인하는 것과 유사합니다. 당신은 당신의 처분에 더 휴대용 및 일반적인 도구를 가지고 있습니다.
다른 팁
C 및 C ++에서 32 비트 및 64 비트 빌드를 감지하는 아키텍처 독립적 인 방법은 다음과 같습니다.
// C
#include <stdint.h>
// C++
#include <cstdint>
#if INTPTR_MAX == INT64_MAX
// 64-bit
#elif INTPTR_MAX == INT32_MAX
// 32-bit
#else
#error Unknown pointer size or missing size macros!
#endif
이것은 MSVC ++ 및 G ++에서 작동합니다.
#if defined(_M_X64) || defined(__amd64__)
// code...
#endif
레이몬드 이것을 다룹니다.
#ifdef _LP64
두 플랫폼에서 작동합니다
Mac OS X에 대한 좋은 개요는 다음과 같습니다.
http://developer.apple.com/documentation/darwin/conceptual/64bitporting
Windows 플랫폼을 위해 컴파일하는 경우 다음을 사용해야합니다.
#ifdef _WIN64
MSVC 컴파일러는 X64 및 IA64 플랫폼 모두에 대해이를 정의합니다 (해당 시장을 삭감하고 싶지 않습니까?). GCC가 똑같이하는지 확실하지 않지만 그렇지 않은 경우해야합니다.
대안은
#ifdef WIN64
미묘한 차이가 있습니다. Win64 (주요 밑줄이없는)는 SDK (또는 빌드 구성)에 의해 정의됩니다. 이것은 SDK/빌드 구성에 의해 정의되므로 GCC 와도 마찬가지로 작동해야합니다.
Windows를 사용하는 경우 64 비트 운영 체제 (AKA WOW64)에서 실행되는 32 비트 프로세스가 4와 같기 때문에 레지스트리에서 "Processor_Architecture"환경 변수를 얻는 것이 더 좋습니다.
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SYSTEM\CurrentControlSet\\Control\\Session Manager\\Environment"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
LPSTR szArch = new CHAR[100];
ZeroMemory(szArch, 100);
if (RegQueryValueEx(hKey, _T("PROCESSOR_ARCHITECTURE"), NULL, NULL, (LPBYTE)szArch, &dwSize) == ERROR_SUCCESS) {
if (strcmp(szArch, "AMD64") == 0)
this->nArchitecture = 64;
else
this->nArchitecture = 32;
} else {
this->nArchitecture = (sizeof(PVOID) == 4 ? 32 : 64);
}
RegCloseKey(hKey);
}