2009-10-30 5 views
9

¿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

18

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 
2

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.

+0

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

+0

Lo siento, quise decir, el rendimiento en mi caso particular no es importante. – dreamlax

8

El compilador Visual C++ define las siguientes macros:

  • _M_IX86 - x86 plataforma
  • _M_IA64 - plataforma IA64
  • _M_X64 - x64 plataforma
+4

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. –

+0

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. –

+0

Lo siento, lo retrotrajo: el compilador define _WIN32 y _WIN64, así como los específicos del procesador. –

10

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.

+0

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. –

+0

"Windows Platform SDK (o lo que sea que lo llamen este año)" ¡Cómo odio ese cambio de nombre constante! +1 – sbi

+0

@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'? –

Cuestiones relacionadas