¿Hay una macro de preprocesador simple que se define para una compilación de 64 bits? Pensé que _WIN64
podría haberlo sido, pero incluso cuando construyo un objetivo de 32 bits, las partes incluidas en un #ifdef _WIN64 ... #endif
están compiladas, y esto está causando problemas. Es viernes y no puedo pensar con claridad, pero estoy seguro de que estoy pasando por alto algo muy simple aquí. Tal vez incluso algo relacionado con sizeof
.¿Es posible verificar si está compilando para 64 bits con Microsoft C Compiler?
Respuesta
siempre he utilizado _WIN64 Para comprobar si es una compilación de 64 bits.
N.B. _WIN32 es también siempre (de forma automática) definido por MSVC en 64 bits se basa, a fin de comprobar para _WIN64 antes de la facturación para _WIN32:
#if defined(_WIN64)
// Windows 64 bit code here
#elif defined(_WIN32)
// Windows 32 bit code here
#else
// Non-Windows code here
#endif
Compruebe las propiedades de compilación de su proyecto, especialmente la sección de preprocesador. ¿Está definiendo _WIN64
en algún lugar de WIN32
compilaciones? La cosa sizeof
probablemente no funcionará ya que no se puede usar en una prueba #if
.
El compilador Visual C++ define las siguientes macros:
- _M_IX86 - x86 plataforma
- _M_IA64 - plataforma IA64
- _M_X64 - x64 plataforma
Sin embargo, '_WIN64' /' WIN64'/'_WIN32' /' WIN32' casi siempre debería usarse en su lugar si Windows es el objetivo; las definiciones que menciona deberían usarse solo si realmente necesita lidiar con diferencias específicas del procesador (que debería ser raro) en lugar de diferencias en la plataforma del sistema operativo (que son más comunes). Si '_WIN64' se establece incorrectamente en compilaciones de 32 bits, el problema debe solucionarse en lugar de evitarlo. –
La diferencia es que las macros _WIN64, etc. son definidas por usted (o para usted) en su proyecto y las macros _M_X64, etc. están definidas por el compilador. –
Lo siento, lo retrotrajo: el compilador define _WIN32 y _WIN64, así como los específicos del procesador. –
Parece que su problema podría estar relacionado con un encabezado o un proyecto de establecimiento de la definición inadecuada _WIN64
- eso debería dejarse al compilador.
Hay una diferencia sutil entre WIN64
y _WIN64
(al menos para los compiladores de Microsoft - otros compiladores deben seguir su ejemplo, pero no todos lo hacen):
_WIN64
se define por el compilador cuando es la construcción de una programa para una plataforma de Windows de 64 bits. Tenga en cuenta que este nombre está en el espacio de nombres del implementador compilador (subrayado inicial seguido de una letra mayúscula)WIN64
se define por el de Windows SDK de la plataforma (o lo están llamando este año) cuando la orientación de una plataforma de 64 bits .
Así que si sólo está incluyendo cabeceras estándar y no tomar otras medidas para definirlo, WIN64
se no ser definido.
Hay una historia similar para _WIN32
y WIN32
- pero la comprobación de otros compiladores: GCC 3.4.5 Cómo define WIN32
incluso si sólo se utilizan cabeceras estándar. Como lo hace Digital Mars.
Los compiladores de Microsoft y Comeau no.
Otro poco de trivia (con suerte) bien conocido es que _WIN32
y WIN32
se establecen al apuntar a las plataformas de Windows de 64 bits. Demasiadas cosas se habrían roto de otra manera.
Consulte http://stackoverflow.com/questions/662084/whats-the-difference-between-the-win32-and-win32-defines-in-c/662543#662543 para obtener más trivialidades sobre nombres que difieren solo en un guion bajo. –
"Windows Platform SDK (o lo que sea que lo llamen este año)" ¡Cómo odio ese cambio de nombre constante! +1 – sbi
@MichaelBurr ¿Dónde se define 'WIN64'? ¿Podrías (o alguien) señalar el lugar exacto? Lo busqué en algunas versiones de Platform SDK y Visual Studio, pero no encontré ningún '#define WIN64' en absoluto. (Sin embargo, se usa _ en un par de lugares, lo que parece incorrecto ...) ¿Se debería abandonar 'WIN64' y siempre se debería reemplazar por' _WIN64'? –
- 1. ¿Existe una directiva de preprocesador GCC para verificar si el código se está compilando en una máquina de 64 bits?
- 2. ¿Cómo puedo detectar si estoy compilando para una arquitectura de 64 bits en C++
- 3. compilación de 64 bits en microsoft visual C++ express 2010
- 4. Verificar si Solidworks está instalado?
- 5. QtCreator para windows: ¿es posible construir 64 bits .exe?
- 6. ¿Cómo puedo verificar si un binario compilado es de 32 bits o de 64 bits?
- 7. Comprobando si el archivo es de 32 bits o de 64 bits: en Windows
- 8. Qué comando usar para comprobar si python es de 64 bits o de 32 bits
- 9. ¿Es posible compilar svdlibc en un mac (64 bits)?
- 10. Es TIdHTTPServer Compatible con Microsoft BITS
- 11. C# posible para verificar si se define una var?
- 12. Cómo comprobar si IIS está en el modo de 32 bits o de 64 bits
- 13. Usando C#, ¿cómo saber si mi máquina es de 64 bits o 32 bits?
- 14. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
- 15. 64 bits ODBC Excepción
- 16. ¿Cómo hago para que Microsoft Script Debugger funcione con Windows 7 de 64 bits?
- 17. Acceso de registro con C# y "BUILD x86" en una máquina de 64 bits
- 18. Microsoft C Compiler: declaración de variable en línea?
- 19. Cómo verificar el kernel de 32 bits/64 bits para Linux
- 20. ¿Es posible verificar si una notificación es visible o cancelada?
- 21. ¿es posible verificar si el pdf está protegido con contraseña usando ghostscript?
- 22. Puerto 32 bits Controlador de Windows a 64 bits Windows
- 23. Rieles: ¿es posible verificar si una cadena es binaria?
- 24. ¿Es posible acceder a un dll de 64 bits desde una aplicación de 32 bits?
- 25. sizeof (long) en 64 bits C++
- 26. Determine si el proceso actual de PowerShell es de 32 bits o de 64 bits.
- 27. ¿Es posible detectar 32 bits frente a 64 bits en un script bash?
- 28. para verificar si todo EditText está vacío
- 29. ¿Es posible obtener menús nativos con Qt4 en Windows 7, de 64 bits?
- 30. Verificar si datepicker está abierto
La cosa 'sizeof' no funcionará para los comandos del preprocesador, pero se debe optimizar una instrucción' if' que tenga una constante de tiempo de compilación (es decir 'if (sizeof (long) == 4)'.Recuerdo haber visto esto en la implementación de 'strlen' de GNU. El código solo se ejecuta una o dos veces, por lo que el rendimiento no es importante. – dreamlax
Lo siento, quise decir, el rendimiento en mi caso particular no es importante. – dreamlax