2008-09-30 14 views
61

¿Cuál es la forma más confiable de averiguar la arquitectura de la CPU al compilar el código C o C++? Por lo que puedo decir, los diferentes compiladores tienen su propio conjunto de definiciones de preprocesador no estándar (_M_X86 en MSVS, __i386__, __arm__ en GCC, etc.).Detección de tiempo de compilación de la arquitectura de la CPU

¿Hay un estándar forma de detectar la arquitectura que estoy construyendo? Si no es así, ¿hay una fuente para una lista completa de tales definiciones para varios compiladores, como un encabezado con todos los caracteres repetitivos #ifdef s?

+0

Básicamente la misma respuesta para la detección del sistema operativo: http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive –

Respuesta

60

Aquí hay información sobre Pre-defined Architecture Macros y otros tipos de macros predefinidas.

+0

¿El estándar C o C++ define las macros sugestivas para ser utilizadas por diferentes compiladores? –

+0

Esto parece correcto, pero ¿alguien puede citar el documento de GCC que dice que lo usa? –

3

No hay nada estándar. Brian Hook documentó un montón de estos en su "Arnes portátil de código abierto", e incluso trata de convertirlos en algo coherente y utilizable (mmm con respecto a eso). Ver la cabecera posh.h en este sitio:

Nota, el enlace anterior puede requerir que introduzca alguna falsa identificación de usuario/contraseña debido a un ataque DOS hace algún tiempo.

+5

-1, Boo a los enlaces que requieren contraseñas. – paxos1977

+2

Jeez, perdón por el enlace falso, debería ser http://hookatooka.com/poshlib/ que proporciona información sobre el ID de usuario/contraseña. Mi navegador debe tener "inicio de sesión automático" de una visita previa a la página. –

+0

¡Bonito enlace! :) ..... –

14

No hay un estándar entre compiladores, pero cada compilador tiende a ser bastante consistente. Se puede construir una cabecera por sí mismo que es algo como esto:

#if MSVC 
#ifdef _M_X86 
#define ARCH_X86 
#endif 
#endif 

#if GCC 
#ifdef __i386__ 
#define ARCH_X86 
#endif 
#endif 

No hay mucho punto a una lista exhaustiva, ya que hay miles de compiladores, pero sólo 3-4 en uso generalizado (Microsoft C++, GCC, Intel CC , tal vez TenDRA?). Simplemente decida qué compiladores admitirá su aplicación, liste sus #defines y actualice su encabezado según sea necesario.

+2

Esto no funcionó para mí en Visual Studio 2010. '_M_X86' no se definió positivamente (compilación de 32 bits). El correcto es '_M_IX86' (crédito al enlace de Serge arriba). – Thomas

-2

Si necesita una detección detallada de las funciones de la CPU, la mejor opción es enviar también un programa CPUID que emita a stdout o algún archivo "cpu_config.h" el conjunto de características admitidas por la CPU. Luego integra ese programa con su proceso de compilación.

+2

No funcionará para la compilación cruzada.¿Y cómo compila un programa de cpuid a menos que sepa en qué máquina necesita ejecutarse? – jforberg

3

Si desea volcar todas las características disponibles en una plataforma en particular, usted podría funcionar como GCC:

gcc -march=native -dM -E - </dev/null

Sería vertederos de Marcos como #define __SSE3__ 1, #define __AES__ 1, etc.

+0

'-march = native' falla para ARM y MIPS para GCC 4.9 y siguientes. – jww

Cuestiones relacionadas