Как я могу определить, компилирую ли я для 64-битной архитектуры в С++
В С++-функции мне нужен компилятор для выбора другого блока, если он компилируется для 64-битной архитектуры.
Я знаю способ сделать это для MSVС++ и g++, поэтому я отправлю его как ответ. Однако я хотел бы знать, есть ли лучший способ (более элегантный, который будет работать для всех компиляторов/всех 64-битных архитектур). Если нет лучшего способа, какие другие предопределенные макросы следует искать, чтобы быть совместимыми с другими компиляторами/архитектурами?
Ответы
Ответ 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
Ответ 4
Raymond охватывает это.
Ответ 5
#ifdef _LP64
Работает на обеих платформах
Ответ 6
Если вы компилируете для платформы Windows, вы должны использовать:
#ifdef _WIN64
Компилятор MSVC определяет, что для платформ x64 и ia64 (вы не хотите вырезать этот рынок, не так ли?). Я не уверен, что gcc делает то же самое - но он должен, если это не так.
Альтернативой является
#ifdef WIN64
который имеет тонкую разницу. WIN64 (без главного подчеркивания) определяется SDK (или конфигурацией сборки). Поскольку это определяется конфигурацией SDK/build, она должна работать так же хорошо с gcc.
Ответ 7
Вот хороший обзор для Mac OS X:
http://developer.apple.com/documentation/Darwin/Conceptual/64bitPorting
Ответ 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);
}