C ++에서 64bits 아키텍처를 컴파일하는 경우 어떻게 감지 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/163058

  •  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);
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top