2011-07-15 9 views
6

Necesito establecer #ifdef - comprueba la compilación condicional. Quiero automatizar el proceso pero no puedo especificar el sistema operativo/máquina objetivo. ¿Hay alguna manera de que el precompilador pueda resolver si se está ejecutando en 32 bits o 64 bits?¿Existe una manera estándar de determinar en tiempo de compilación si el sistema es de 32 o 64 bits?

(Explicación) Necesito definir un tipo de 64 bits de tamaño. En el sistema operativo de 64 bits es largo, en la mayoría de los otros es de larga duración.

Encontré this answer - ¿es esta la forma correcta de hacerlo?

[editar] un handy reference for compiler macros

+3

Cuál es exactamente su definición de un sistema de 64 bits? (Esta es una pregunta seria) – NPE

+0

¿Por qué le importa a su programa? – lhf

+4

¿Desea que el código compile el código como de 32 bits si el compilador se ejecuta en una máquina de 32 bits o de 64 bits si el compilador se está ejecutando en una máquina de 64 bits? No entiendo muy bien tu pregunta. También me resulta bastante difícil creer que no se puede especificar el sistema operativo/máquina objetivo, especialmente si usted es el que compila la fuente. –

Respuesta

10

La única verificación de compilación que puede hacer de manera confiable sería sizeof(void*) == 8, verdadera para x64 y falsa para x86. Este es un constexpr y puedes pasarlo a las plantillas, pero puedes olvidarte de usar ifdef con él. No existe una forma independiente de la plataforma para conocer el tamaño de la dirección de la arquitectura de destino (en el tiempo previo al proceso), deberá solicitarle a su IDE una. El estándar ni siquiera tiene el concepto del tamaño de la dirección.

+0

buena sugerencia re plantillas, creo que será el camino a seguir, más seguro de todos modos. – slashmais

-2

Probablemente la forma más fácil podría comparar el tamaño de int y long long. No puede hacerlo en el preprocesador, pero puede usarlo en static_assert.

Editar: WoW todos los votos negativos. Hice mi punto un poco más claro. También parece que debería haber mencionado 'long long' en vez de 'long' por la forma en que trabaja MSVC.

+1

-1: No realmente ... –

+0

Quizás se refiera a INT_MAX y LONG_MAX? – lhf

+0

En MSVC tanto int como long son 32 bits en un destino de 64 bits. – Puppy

1

Bueno, la respuesta es claramente específica del sistema operativo, por lo que debe reducir sus requisitos.

Por ejemplo, en Unix uname -a suele proporcionar suficiente información para distinguir una compilación de 32 bits del sistema operativo de una compilación de 64 bits.

El comando puede ser invocado por su precompilador. Dependiendo de su salida, los indicadores del compilador se pueden configurar de manera apropiada.

+0

que no es un tiempo de compilación, marque –

+0

O use un símbolo de 'gcc -dM -E - lhf

4

No hay sin soporte de idioma estándar para que la macro determine si la máquina es una etapa de 64 o 32 bits en el preprocesador.

4

En respuesta a su edición, hay una manera de "macro-menos para usted" para obtener un tipo que es de 64 bits.

si necesita un tipo que pueda contener 64 bits, luego #include <cstdint> y use int64_t o uint64_t. También puede usar the Standard Integer Types provided by Boost.

Otra opción es usar long long. Técnicamente no es parte del estándar de C++ (estará en C++ 0x) pero es compatible con casi todos los compiladores.

0

Me sentiría tentado a levantar la detección del código y poner eso en el Makefile. Luego, puede aprovechar las herramientas del sistema para detectar y establecer la macro apropiada sobre la cual está cambiando su código.

En su Makefile ...

<do stuff to detect and set SUPPORT_XX_BIT to the appropriate value> 
gcc myFile.c -D$(SUPPORT_XX_BIT) -o myFile 

En su código ...

#if defined(SUPPORT_32_BIT) 
... 
#elif defined(SUPPORT_64_BIT) 
... 
#else 
    #error "Select either 32 or 64 bit option\n" 
#endif 
1

me gustaría ver el código fuente para una biblioteca multiplataforma. Es una parte bastante grande. Cada par de sistema operativo y compilador tiene su propio conjunto de definiciones. Pocas bibliotecas Usted puede mirar:
http://www.libsdl.org/\include\SDL_config*.h (unos archivos)
http://qt.nokia.com/\src\corelib\global\qglobal.h

Cuestiones relacionadas