una tenido tener tacto síntomas semanas semana saliendo saber relaciones que puedo para masaje hacer haber estoy estas embarazada despues como antes c++ 64bit c-preprocessor

c++ - tenido - síntomas antes de saber que estas embarazada



¿Cómo puedo detectar si estoy compilando para una arquitectura de 64 bits en C++? (8)

En una función de C ++, necesito que el compilador elija un bloque diferente si está compilando para una arquitectura de 64 bits.

Conozco una forma de hacerlo para MSVC ++ y g ++, así que lo publicaré como respuesta. Sin embargo, me gustaría saber si hay una mejor manera (más elegante que funcionaría para todos los compiladores / todas las arquitecturas de 64 bits). Si no hay una manera mejor, ¿qué otras macros predefinidas debo buscar para ser compatible con otros compiladores / arquitecturas?




Si está compilando para la plataforma de Windows, debe usar:

#ifdef _WIN64

El compilador de MSVC define eso para las plataformas x64 e ia64 (no quiere cortar ese mercado, ¿verdad?). No estoy seguro de si gcc hace lo mismo, pero debería hacerlo si no lo hace.

Una alternativa es

#ifdef WIN64

que tiene una sutil diferencia. WIN64 (sin el subrayado inicial) está definido por el SDK (o la configuración de compilación). Como esto está definido por SDK / build config, debería funcionar igual de bien con gcc.


#ifdef _LP64

Funciona en ambas plataformas


¿Por qué estás eligiendo un bloque sobre el otro? Si su decisión se basa en el tamaño de un puntero, use sizeof(void*) == 8 . Si su decisión se basa en el tamaño de un entero, use sizeof(int) == 8 .

Mi punto es que el nombre de la arquitectura en sí raramente debería marcar la diferencia. Verifica solo lo que necesita verificar, para los fines de lo que va a hacer. Su pregunta no cubre muy claramente cuál es su propósito del cheque. Lo que está preguntando es similar a tratar de determinar si DirectX está instalado al consultar la versión de Windows. Tiene más herramientas portátiles y genéricas a su disposición.


Si usa Windows, probablemente sea mejor obtener la variable de entorno "PROCESSOR_ARCHITECTURE" del registro porque sizeof (PVOID) será igual a 4 si es un proceso de 32 bits que se ejecuta en un sistema operativo de 64 bits (también conocido como 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); }


Esto funciona para MSVC ++ y g ++:

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


Una forma independiente de la arquitectura para detectar compilaciones de 32 y 64 bits en C y C ++ se ve así:

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