How can I detect if I'm compiling for a 64bits architecture in C++

前端 未结 8 1667
难免孤独
难免孤独 2020-12-29 23:07

In a C++ function I need the compiler to choose a different block if it is compiling for a 64 bit architecture.

I know a way to do it for MSVC++ and g++, so I\'ll po

相关标签:
8条回答
  • 2020-12-29 23:09

    This works for MSVC++ and g++:

    #if defined(_M_X64) || defined(__amd64__)
      // code...
    #endif
    
    0 讨论(0)
  • 2020-12-29 23:15

    An architecture-independent way to detect 32-bit and 64-bit builds in C and C++ looks like this:

    // 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
    
    0 讨论(0)
  • 2020-12-29 23:16

    If your using Windows, your probably better to get the "PROCESSOR_ARCHITECTURE" environment variable from the registry because sizeof(PVOID) will equal 4 if its a 32bit process running on a 64bit operating system (aka WOW64):

        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);
        }
    
    0 讨论(0)
  • 2020-12-29 23:22

    Why are you choosing one block over the other? If your decision is based on the size of a pointer, use sizeof(void*) == 8. If your decision is based on the size of an integer, use sizeof(int) == 8.

    My point is that the name of the architecture itself should rarely make any difference. You check only what you need to check, for the purposes of what you are going to do. Your question does not cover very clearly what your purpose of the check is. What you are asking is akin to trying to determine if DirectX is installed by querying the version of Windows. You have more portable and generic tools at your disposal.

    0 讨论(0)
  • 2020-12-29 23:25

    Here's a good overview for Mac OS X:

    http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting

    0 讨论(0)
  • 2020-12-29 23:28

    If you're compiling for the Windows platform, you should use:

    #ifdef _WIN64
    

    The MSVC compiler defines that for both x64 and ia64 platforms (you don't want to cut out that market, do you?). I'm not sure if gcc does the same - but it should if it doesn't.

    An alternative is

    #ifdef WIN64
    

    which has a subtle difference. WIN64 (without the leading underscore) is defined by the SDK (or the build configuration). Since this is defined by the SDK/build config, it should work just as well with gcc.

    0 讨论(0)
提交回复
热议问题