Подтвердить что ты не робот

Как я могу определить, компилирую ли я для 64-битной архитектуры в С++

В С++-функции мне нужен компилятор для выбора другого блока, если он компилируется для 64-битной архитектуры.

Я знаю способ сделать это для MSVС++ и g++, поэтому я отправлю его как ответ. Однако я хотел бы знать, есть ли лучший способ (более элегантный, который будет работать для всех компиляторов/всех 64-битных архитектур). Если нет лучшего способа, какие другие предопределенные макросы следует искать, чтобы быть совместимыми с другими компиляторами/архитектурами?

4b9b3361

Ответ 1

Почему вы выбираете один блок над другим? Если ваше решение основано на размере указателя, используйте sizeof(void*) == 8. Если ваше решение основано на размере целого числа, используйте sizeof(int) == 8.

Я хочу сказать, что имя самой архитектуры редко должно иметь значение. Вы проверяете только то, что вам нужно проверить, в целях того, что вы собираетесь делать. Ваш вопрос не очень четко описывает, какова ваша цель проверки. То, что вы просите, сродни попытке определить, установлен ли DirectX, запрашивая версию Windows. У вас есть более портативные и общие инструменты в вашем распоряжении.

Ответ 2

Это работает для MSVС++ и g++:

#if defined(_M_X64) || defined(__amd64__)
  // code...
#endif

Ответ 3

Независимый от архитектуры способ обнаружения 32-битных и 64-разрядных построений в C и С++ выглядит следующим образом:

// 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

Ответ 5

#ifdef _LP64

Работает на обеих платформах

Ответ 6

Если вы компилируете для платформы Windows, вы должны использовать:

#ifdef _WIN64

Компилятор MSVC определяет, что для платформ x64 и ia64 (вы не хотите вырезать этот рынок, не так ли?). Я не уверен, что gcc делает то же самое - но он должен, если это не так.

Альтернативой является

#ifdef WIN64

который имеет тонкую разницу. WIN64 (без главного подчеркивания) определяется SDK (или конфигурацией сборки). Поскольку это определяется конфигурацией SDK/build, она должна работать так же хорошо с gcc.

Ответ 8

Если вы используете Windows, вероятно, вам лучше получить переменную окружения PROCESSOR_ARCHITECTURE из реестра, потому что sizeof (PVOID) будет равен 4, если его 32-битный процесс работает в 64-битной операционной системе (иначе 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);
    }